diff --git a/app/src/main/java/com/example/liquid_test_2/MainActivity.java b/app/src/main/java/com/example/liquid_test_2/MainActivity.java index d41fd18..8a1fce3 100644 --- a/app/src/main/java/com/example/liquid_test_2/MainActivity.java +++ b/app/src/main/java/com/example/liquid_test_2/MainActivity.java @@ -8,12 +8,6 @@ import com.crux.sdk.CruxClient; import com.crux.sdk.model.*; -//import com.crux.sdk.model.CruxAddress; -//import com.crux.sdk.model.CruxClientError; -//import com.crux.sdk.model.CruxClientInitConfig; -//import com.crux.sdk.model.CruxClientResponseHandler; -//import com.crux.sdk.model.CruxIDState; -//import com.crux.sdk.model.CruxPutAddressMapSuccess; import java.io.IOException; import java.util.HashMap; @@ -111,6 +105,35 @@ public void onErrorResponse(CruxClientError failureResponse) { } }); + client.getEnabledAssetGroups(new CruxClientResponseHandler() { + @Override + public void onResponse(String[] successResponse) { + System.out.println("--------getEnabledAssetGroups-------"); + System.out.println(successResponse); + } + + @Override + public void onErrorResponse(CruxClientError failureResponse) { + System.err.println(failureResponse.errorCode); + System.err.println(failureResponse.errorMessage); + } + }); + + final String[] assetGroups = {"ERC20_eth"}; + client.putEnabledAssetGroups(assetGroups, new CruxClientResponseHandler() { + @Override + public void onResponse(String[] successResponse) { + System.out.println("--------putEnabledAssetGroups-------"); + System.out.println(successResponse); + } + + @Override + public void onErrorResponse(CruxClientError failureResponse) { + System.err.println(failureResponse.errorCode); + System.err.println(failureResponse.errorMessage); + } + }); + final String testResolveAddressCruxId = "mascot6699@cruxdev.crux"; client.resolveCurrencyAddressForCruxID(testResolveAddressCruxId, "xrp", new CruxClientResponseHandler() { @Override @@ -125,6 +148,20 @@ public void onErrorResponse(CruxClientError failureResponse) { } }); + HashMap assetMatcher = getAssetMatcher(); + client.resolveAssetAddressForCruxID(testResolveAddressCruxId, assetMatcher, new CruxClientResponseHandler() { + @Override + public void onResponse(CruxAddress successResponse) { + System.out.println("--------resolveAssetAddressForCruxID-------"); + System.out.println(successResponse); + } + + @Override + public void onErrorResponse(CruxClientError failureResponse) { + System.out.println(failureResponse); + } + }); + HashMap newAddressMap = getCurrencyMap(); client.putAddressMap(newAddressMap, new CruxClientResponseHandler() { @@ -154,4 +191,11 @@ private HashMap getCurrencyMap() { return currencyMap; } + private HashMap getAssetMatcher() { + HashMap assetMatcher = new HashMap<>(); + assetMatcher.put("assetGroup", "ERC20_ETH"); +// assetMatcher.put("assetIdentifierValue", "0xE41d2489571d322189246DaFA5ebDe1F4699F498") + return assetMatcher; + } + } diff --git a/build.gradle b/build.gradle index db77778..648f156 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.5.3' + classpath 'com.android.tools.build:gradle:3.6.0' classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' // NOTE: Do not place your application dependencies here; they belong diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 58d2953..97428ec 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Oct 28 19:14:23 IST 2019 +#Wed Feb 26 13:35:41 IST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip diff --git a/sdk/src/main/assets/cruxpay-0.2.4.js b/sdk/src/main/assets/cruxpay-0.2.5.js similarity index 98% rename from sdk/src/main/assets/cruxpay-0.2.4.js rename to sdk/src/main/assets/cruxpay-0.2.5.js index 9cc921e..c4ceaa0 100644 --- a/sdk/src/main/assets/cruxpay-0.2.4.js +++ b/sdk/src/main/assets/cruxpay-0.2.5.js @@ -3944,7 +3944,7 @@ exports.PackageErrorCode = PackageErrorCode; PackageErrorCode[PackageErrorCode["GaiaCruxPayGetFailed"] = 2102] = "GaiaCruxPayGetFailed"; PackageErrorCode[PackageErrorCode["GaiaClientConfigGetFailed"] = 2103] = "GaiaClientConfigGetFailed"; PackageErrorCode[PackageErrorCode["GaiaGetFileFailed"] = 2105] = "GaiaGetFileFailed"; - PackageErrorCode[PackageErrorCode["TokenVerificationFailed"] = 2106] = "TokenVerificationFailed"; + PackageErrorCode[PackageErrorCode["GaiaRecordIntegrityFailed"] = 2106] = "GaiaRecordIntegrityFailed"; PackageErrorCode[PackageErrorCode["GaiaEmptyResponse"] = 2107] = "GaiaEmptyResponse"; PackageErrorCode[PackageErrorCode["FailedToGetGaiaUrlFromZonefile"] = 2018] = "FailedToGetGaiaUrlFromZonefile"; // 3000s: Registry errors @@ -3974,8 +3974,8 @@ exports.PackageErrorCode = PackageErrorCode; PackageErrorCode[PackageErrorCode["BlockstackDomainNamespaceValidation"] = 4020] = "BlockstackDomainNamespaceValidation"; // Internal errors PackageErrorCode[PackageErrorCode["CouldNotFindBlockstackConfigurationServiceClientConfig"] = 5001] = "CouldNotFindBlockstackConfigurationServiceClientConfig"; - PackageErrorCode[PackageErrorCode["CouldNotFindKeyPairToRestoreIdentity"] = 5002] = "CouldNotFindKeyPairToRestoreIdentity"; - PackageErrorCode[PackageErrorCode["CouldNotValidateZoneFile"] = 5003] = "CouldNotValidateZoneFile"; + PackageErrorCode[PackageErrorCode["CouldNotFindKeyPairToRestoreIdentity"] = 5002] = "CouldNotFindKeyPairToRestoreIdentity"; // CouldNotValidateZoneFile = 5003, + PackageErrorCode[PackageErrorCode["CouldNotFindIdentityKeyPairToPutAddressMapping"] = 5004] = "CouldNotFindIdentityKeyPairToPutAddressMapping"; PackageErrorCode[PackageErrorCode["CouldNotFindAssetListInClientConfig"] = 5005] = "CouldNotFindAssetListInClientConfig"; PackageErrorCode[PackageErrorCode["CouldNotFindKeyPairToRegisterName"] = 5006] = "CouldNotFindKeyPairToRegisterName"; @@ -3986,6 +3986,7 @@ exports.PackageErrorCode = PackageErrorCode; PackageErrorCode[PackageErrorCode["MissingCruxDomainInCruxWalletClient"] = 5011] = "MissingCruxDomainInCruxWalletClient"; PackageErrorCode[PackageErrorCode["MissingZoneFile"] = 5012] = "MissingZoneFile"; PackageErrorCode[PackageErrorCode["MissingNameOwnerAddress"] = 5013] = "MissingNameOwnerAddress"; + PackageErrorCode[PackageErrorCode["MissingUserCruxAssetTranslator"] = 5014] = "MissingUserCruxAssetTranslator"; })(PackageErrorCode || (exports.PackageErrorCode = PackageErrorCode = {})); },{}],"UOYu":[function(require,module,exports) { "use strict"; @@ -3999,7 +4000,8 @@ var _packageErrorCode = require("./package-error-code"); var _a; -var ERROR_STRINGS = (_a = {}, _a[_packageErrorCode.PackageErrorCode.AddressMappingDecodingFailure] = "AddressMapping decoding failure", _a[_packageErrorCode.PackageErrorCode.AddressNotAvailable] = "Currency address not available for user", _a[_packageErrorCode.PackageErrorCode.AssetIDNotAvailable] = "AssetID doesn\'t exist in client mapping", _a[_packageErrorCode.PackageErrorCode.BlockstackIdInvalidStructure] = "Invalid Blockstack ID", _a[_packageErrorCode.PackageErrorCode.BlockstackDomainInvalidStructure] = "Invalid Blockstack Domain", _a[_packageErrorCode.PackageErrorCode.BlockstackDomainNamespaceValidation] = "Invalid Blockstack Domain namespace: '{0}', should end with .id", _a[_packageErrorCode.PackageErrorCode.BlockstackIdInvalidSubdomainForTranslation] = "Invalid Blockstack ID, subdomain must be non null to be translated", _a[_packageErrorCode.PackageErrorCode.InvalidBlockstackDomainForTranslation] = "Only Blockstack Domains ending with _crux can be translated", _a[_packageErrorCode.PackageErrorCode.BlockstackIdNamespaceValidation] = "Invalid Blockstack ID namespace: '{0}', should end with .id", _a[_packageErrorCode.PackageErrorCode.BnsEmptyData] = "No name data available", _a[_packageErrorCode.PackageErrorCode.BnsResolutionFailed] = "'{0}' node not available because '{1}'", _a[_packageErrorCode.PackageErrorCode.ExistingCruxIDFound] = "keypair is already used in registration of CruxID: '{0}'", _a[_packageErrorCode.PackageErrorCode.ClientNotInitialized] = "CRUX Client not initialized.", _a[_packageErrorCode.PackageErrorCode.ConfigKeyManagerRequired] = "CruxOnBoardingClient should be instantiated with ConfigKeyManager", _a[_packageErrorCode.PackageErrorCode.CouldNotFindAssetListInClientConfig] = "Missing global asset list", _a[_packageErrorCode.PackageErrorCode.CouldNotFindBlockstackConfigurationServiceClientConfig] = "Missing client-config for: '{0}'", _a[_packageErrorCode.PackageErrorCode.CouldNotFindIdentityKeyPairToPutAddressMapping] = "Missing IdentityKeyPair", _a[_packageErrorCode.PackageErrorCode.CouldNotFindKeyPairToRestoreIdentity] = "Require keypair for restoring the identity", _a[_packageErrorCode.PackageErrorCode.CouldNotFindKeyPairToRegisterName] = "Require keypair for registering name/subdomain", _a[_packageErrorCode.PackageErrorCode.CouldNotValidateZoneFile] = "Invalid zonefile", _a[_packageErrorCode.PackageErrorCode.CruxDomainInvalidStructure] = "Invalid Crux Domian", _a[_packageErrorCode.PackageErrorCode.CruxDomainNamespaceValidation] = "Invalid Crux Domain namespace: '{0}', should end with .crux", _a[_packageErrorCode.PackageErrorCode.CruxIdNamespaceValidation] = "Invalid Crux ID namespace: '{0}', should end with .crux", _a[_packageErrorCode.PackageErrorCode.CruxIdInvalidStructure] = "Invalid Crux ID", _a[_packageErrorCode.PackageErrorCode.CruxIDUnavailable] = "'{0}' name is unavailable", _a[_packageErrorCode.PackageErrorCode.CurrencyDoesNotExistInClientMapping] = "Currency does not exist in wallet's client mapping", _a[_packageErrorCode.PackageErrorCode.DecryptionFailed] = "Decryption failed", _a[_packageErrorCode.PackageErrorCode.DifferentWalletCruxID] = "Already has a Crux ID registered with different wallet", _a[_packageErrorCode.PackageErrorCode.IsNotSupported] = "Method is not supported", _a[_packageErrorCode.PackageErrorCode.ExpectedEncryptionKeyValue] = "Missing encryptionKey method", _a[_packageErrorCode.PackageErrorCode.FetchPendingRegistrationsByAddressFailed] = "'{0}' failed with error '{1}'", _a[_packageErrorCode.PackageErrorCode.GaiaClientConfigUploadFailed] = "Unable to upload '{0}' to gaia: '{1}'", _a[_packageErrorCode.PackageErrorCode.GaiaCruxPayUploadFailed] = "Unable to upload '{0}' to gaia: '{1}'", _a[_packageErrorCode.PackageErrorCode.GaiaEmptyResponse] = "Gaia sent empty response", _a[_packageErrorCode.PackageErrorCode.GetAddressMapFailed] = "No address found for CRUX ID", _a[_packageErrorCode.PackageErrorCode.GaiaCruxPayGetFailed] = "Unable to get from gaia: '{0}'", _a[_packageErrorCode.PackageErrorCode.GaiaClientConfigGetFailed] = "Unable to get from gaia : '{0}'", _a[_packageErrorCode.PackageErrorCode.GaiaGetFileFailed] = "Unable to get gaia file: '{0}'", _a[_packageErrorCode.PackageErrorCode.GaiaProfileUploadFailed] = "Unable to upload '{0}' to gaia: '{1}'", _a[_packageErrorCode.PackageErrorCode.GaiaUploadFailed] = "Unable to upload '{0}' to gaia: '{1}'", _a[_packageErrorCode.PackageErrorCode.GetNamesByAddressFailed] = "'{0}' failed with error '{1}'", _a[_packageErrorCode.PackageErrorCode.InvalidPrivateKeyFormat] = "Private key should be either hex encoded, base64 encoded or WIF (base58 - compressed) only", _a[_packageErrorCode.PackageErrorCode.KeyPairMismatch] = "Invalid keyPair provided", _a[_packageErrorCode.PackageErrorCode.MissingCruxDomainInCruxOnBoardingClient] = "No domain found with the key provided or missing key in the CruxOnBoardingClient", _a[_packageErrorCode.PackageErrorCode.MissingCruxDomainInCruxWalletClient] = "No domain found with the key provided or missing key in the CruxWalletClient", _a[_packageErrorCode.PackageErrorCode.MissingZoneFile] = "Missing zonefile for: '{0}'", _a[_packageErrorCode.PackageErrorCode.MissingNameOwnerAddress] = "Missing owner address for: '{0}'", _a[_packageErrorCode.PackageErrorCode.NameIntegrityCheckFailed] = "Name resolution integrity check failed", _a[_packageErrorCode.PackageErrorCode.PrivateKeyRequired] = "CruxClient should be intantiated with a private key", _a[_packageErrorCode.PackageErrorCode.SubdomainLengthCheckFailure] = "Validation failed: Subdomain length must be between 4 to 20", _a[_packageErrorCode.PackageErrorCode.SubdomainRegexMatchFailure] = "Validation failed: Subdomain should start with alphabet and end with alphabet or number. Allowed characters are lowercase alphabets, numbers, - and _", _a[_packageErrorCode.PackageErrorCode.SubdomainRegistrationAcknowledgementFailed] = "Register call to registrar failed: '{0}'", _a[_packageErrorCode.PackageErrorCode.SubdomainRegistrationFailed] = "Register call to registrar failed: '{0}'", _a[_packageErrorCode.PackageErrorCode.TokenVerificationFailed] = "Token verification failed for '{0}'", _a[_packageErrorCode.PackageErrorCode.UserDoesNotExist] = "ID does not exist", _a[_packageErrorCode.PackageErrorCode.IdentityMismatch] = "Identity mismatch", _a[_packageErrorCode.PackageErrorCode.InvalidWalletClientName] = "Invalid Wallet Client Name", _a[_packageErrorCode.PackageErrorCode.InsecureNetworkCall] = "Insecure network call", _a[_packageErrorCode.PackageErrorCode.FailedToGetGaiaUrlFromZonefile] = "Failed to get Gaia URL from user's zonefile: '{0}'", _a); +var ERROR_STRINGS = (_a = {}, _a[_packageErrorCode.PackageErrorCode.AddressMappingDecodingFailure] = "AddressMapping decoding failure", _a[_packageErrorCode.PackageErrorCode.AddressNotAvailable] = "Currency address not available for user", _a[_packageErrorCode.PackageErrorCode.AssetIDNotAvailable] = "AssetID doesn\'t exist in client mapping", _a[_packageErrorCode.PackageErrorCode.BlockstackIdInvalidStructure] = "Invalid Blockstack ID", _a[_packageErrorCode.PackageErrorCode.BlockstackDomainInvalidStructure] = "Invalid Blockstack Domain", _a[_packageErrorCode.PackageErrorCode.BlockstackDomainNamespaceValidation] = "Invalid Blockstack Domain namespace: '{0}', should end with .id", _a[_packageErrorCode.PackageErrorCode.BlockstackIdInvalidSubdomainForTranslation] = "Invalid Blockstack ID, subdomain must be non null to be translated", _a[_packageErrorCode.PackageErrorCode.InvalidBlockstackDomainForTranslation] = "Only Blockstack Domains ending with _crux can be translated", _a[_packageErrorCode.PackageErrorCode.BlockstackIdNamespaceValidation] = "Invalid Blockstack ID namespace: '{0}', should end with .id", _a[_packageErrorCode.PackageErrorCode.BnsEmptyData] = "No name data available", _a[_packageErrorCode.PackageErrorCode.BnsResolutionFailed] = "'{0}' node not available because '{1}'", _a[_packageErrorCode.PackageErrorCode.ExistingCruxIDFound] = "keypair is already used in registration of CruxID: '{0}'", _a[_packageErrorCode.PackageErrorCode.ClientNotInitialized] = "CRUX Client not initialized.", _a[_packageErrorCode.PackageErrorCode.ConfigKeyManagerRequired] = "CruxOnBoardingClient should be instantiated with ConfigKeyManager", _a[_packageErrorCode.PackageErrorCode.CouldNotFindAssetListInClientConfig] = "Missing global asset list", _a[_packageErrorCode.PackageErrorCode.CouldNotFindBlockstackConfigurationServiceClientConfig] = "Missing client-config for: '{0}'", _a[_packageErrorCode.PackageErrorCode.CouldNotFindIdentityKeyPairToPutAddressMapping] = "Missing IdentityKeyPair", _a[_packageErrorCode.PackageErrorCode.CouldNotFindKeyPairToRestoreIdentity] = "Require keypair for restoring the identity", _a[_packageErrorCode.PackageErrorCode.CouldNotFindKeyPairToRegisterName] = "Require keypair for registering name/subdomain", // [PackageErrorCode.CouldNotValidateZoneFile]: "Invalid zonefile", +_a[_packageErrorCode.PackageErrorCode.CruxDomainInvalidStructure] = "Invalid Crux Domian", _a[_packageErrorCode.PackageErrorCode.CruxDomainNamespaceValidation] = "Invalid Crux Domain namespace: '{0}', should end with .crux", _a[_packageErrorCode.PackageErrorCode.CruxIdNamespaceValidation] = "Invalid Crux ID namespace: '{0}', should end with .crux", _a[_packageErrorCode.PackageErrorCode.CruxIdInvalidStructure] = "Invalid Crux ID", _a[_packageErrorCode.PackageErrorCode.CruxIDUnavailable] = "'{0}' name is unavailable", _a[_packageErrorCode.PackageErrorCode.CurrencyDoesNotExistInClientMapping] = "Currency does not exist in wallet's client mapping", _a[_packageErrorCode.PackageErrorCode.DecryptionFailed] = "Decryption failed", _a[_packageErrorCode.PackageErrorCode.DifferentWalletCruxID] = "Already has a Crux ID registered with different wallet", _a[_packageErrorCode.PackageErrorCode.IsNotSupported] = "Method is not supported", _a[_packageErrorCode.PackageErrorCode.ExpectedEncryptionKeyValue] = "Missing encryptionKey method", _a[_packageErrorCode.PackageErrorCode.FetchPendingRegistrationsByAddressFailed] = "'{0}' failed with error '{1}'", _a[_packageErrorCode.PackageErrorCode.GaiaClientConfigUploadFailed] = "Unable to upload '{0}' to gaia: '{1}'", _a[_packageErrorCode.PackageErrorCode.GaiaCruxPayUploadFailed] = "Unable to upload '{0}' to gaia: '{1}'", _a[_packageErrorCode.PackageErrorCode.GaiaEmptyResponse] = "Gaia sent empty response", _a[_packageErrorCode.PackageErrorCode.GetAddressMapFailed] = "No address found for CRUX ID", _a[_packageErrorCode.PackageErrorCode.GaiaCruxPayGetFailed] = "Unable to get from gaia: '{0}'", _a[_packageErrorCode.PackageErrorCode.GaiaClientConfigGetFailed] = "Unable to get from gaia : '{0}'", _a[_packageErrorCode.PackageErrorCode.GaiaGetFileFailed] = "Unable to get gaia file: '{0}'", _a[_packageErrorCode.PackageErrorCode.GaiaProfileUploadFailed] = "Unable to upload '{0}' to gaia: '{1}'", _a[_packageErrorCode.PackageErrorCode.GaiaUploadFailed] = "Unable to upload '{0}' to gaia: '{1}'", _a[_packageErrorCode.PackageErrorCode.GetNamesByAddressFailed] = "'{0}' failed with error '{1}'", _a[_packageErrorCode.PackageErrorCode.InvalidPrivateKeyFormat] = "Private key should be either hex encoded, base64 encoded or WIF (base58 - compressed) only", _a[_packageErrorCode.PackageErrorCode.KeyPairMismatch] = "Invalid keyPair provided", _a[_packageErrorCode.PackageErrorCode.MissingCruxDomainInCruxOnBoardingClient] = "No domain found with the key provided or missing key in the CruxOnBoardingClient", _a[_packageErrorCode.PackageErrorCode.MissingCruxDomainInCruxWalletClient] = "No domain found with the key provided or missing key in the CruxWalletClient", _a[_packageErrorCode.PackageErrorCode.MissingZoneFile] = "Missing zonefile for: '{0}'", _a[_packageErrorCode.PackageErrorCode.MissingNameOwnerAddress] = "Missing owner address for: '{0}'", _a[_packageErrorCode.PackageErrorCode.MissingUserCruxAssetTranslator] = "User client's assetTranslator is required while resolving with assetMatcher properties", _a[_packageErrorCode.PackageErrorCode.NameIntegrityCheckFailed] = "Name resolution integrity check failed", _a[_packageErrorCode.PackageErrorCode.PrivateKeyRequired] = "CruxClient should be intantiated with a private key", _a[_packageErrorCode.PackageErrorCode.SubdomainLengthCheckFailure] = "Validation failed: Subdomain length must be between 4 to 20", _a[_packageErrorCode.PackageErrorCode.SubdomainRegexMatchFailure] = "Validation failed: Subdomain should start with alphabet and end with alphabet or number. Allowed characters are lowercase alphabets, numbers, - and _", _a[_packageErrorCode.PackageErrorCode.SubdomainRegistrationAcknowledgementFailed] = "Register call to registrar failed: '{0}'", _a[_packageErrorCode.PackageErrorCode.SubdomainRegistrationFailed] = "Register call to registrar failed: '{0}'", _a[_packageErrorCode.PackageErrorCode.GaiaRecordIntegrityFailed] = "Gaia record integrity failed for file '{0}' of '{1}'", _a[_packageErrorCode.PackageErrorCode.UserDoesNotExist] = "ID does not exist", _a[_packageErrorCode.PackageErrorCode.IdentityMismatch] = "Identity mismatch", _a[_packageErrorCode.PackageErrorCode.InvalidWalletClientName] = "Invalid Wallet Client Name", _a[_packageErrorCode.PackageErrorCode.InsecureNetworkCall] = "Insecure network call", _a[_packageErrorCode.PackageErrorCode.FailedToGetGaiaUrlFromZonefile] = "Failed to get Gaia URL from user's zonefile: '{0}'", _a); exports.ERROR_STRINGS = ERROR_STRINGS; },{"./package-error-code":"JIdw"}],"Z94C":[function(require,module,exports) { "use strict"; @@ -6442,6 +6444,7 @@ var _a; var assetIdRegex = new RegExp("^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$"); // tslint:disable-next-line: tsr-detect-unsafe-regexp var urlRegex = new RegExp("^(?:http(s)?:\\/\\/)?[\\w.-]+(?:\\.[\\w\\.-]+)+[\\w\\-\\._~:/?#[\\]@!\\$&'\\(\\)\\*\\+,;=.]+$"); +var assetGroupRegex = new RegExp("^(.+)_[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$"); var Validations = /** @class */ @@ -6510,6 +6513,20 @@ function () { }); }; + Validations.validateAssetGroup = function (assetGroup) { + try { + Validations.validateRegex(assetGroup, assetGroupRegex); + } catch (error) { + throw new _error.BaseError(null, "AssetGroup: " + assetGroup + " is not valid."); + } + }; + + Validations.validateAssetGroups = function (assetGroups) { + assetGroups.forEach(function (assetGroup) { + Validations.validateAssetGroup(assetGroup); + }); + }; + Validations.validateNameServiceConfig = function (nameServiceConfig) { // TODO: domain name validation if (nameServiceConfig.gaiaHub) { @@ -6538,15 +6555,6 @@ function () { } }; - Validations.validateAssetIdAddressMap = function (addressMap) { - for (var assetId in addressMap) { - if (addressMap.hasOwnProperty(assetId)) { - Validations.validateAssetId(assetId); - Validations.validateAddressObj(addressMap[assetId]); - } - } - }; - return Validations; }(); @@ -6571,6 +6579,8 @@ var CruxSpec = { }); }, _a.getCruxPayFilename = function (cruxDomainId) { return cruxDomainId.components.domain + "_cruxpay.json"; + }, _a.getCruxUserConfigFileName = function (cruxDomainId) { + return cruxDomainId.components.domain + "_user-config.json"; }, _a), globalAssetList: _globalAssetList.default, idTranslator: _identityUtils.IdTranslator, @@ -7434,29 +7444,59 @@ var CruxAssetTranslator = /** @class */ function () { function CruxAssetTranslator(assetMapping, assetList) { - var e_1, _a; + var _this = this; + + this.symbolAssetGroupToAssetIdAssetGroup = function (symbolAssetGroup) { + return symbolAssetGroup.replace(new RegExp("(.+)_(.+)"), function (match, assetType, assetSymbol) { + return assetType + "_" + _this.symbolToAssetId(assetSymbol); + }); + }; - _cruxSpec.Validations.validateAssetMapping(assetMapping, assetList); + this.assetIdAssetGroupToSymbolAssetGroup = function (assetIdAssetGroup) { + return assetIdAssetGroup.replace(new RegExp("(.+)_(.+)"), function (match, assetType, assetId) { + return assetType + "_" + _this.assetIdToSymbol(assetId); + }); + }; - this.assetMap = this.getLowerAssetMapping(assetMapping); - this.reverseAssetMap = {}; + this.setAssetMap = function (assetMapping) { + _cruxSpec.CruxSpec.validations.validateAssetMapping(assetMapping, _this.assetList); + + _this.assetMap = _this.getLowerAssetMapping(assetMapping); + }; + + this.setReverseAssetMap = function (assetMapping) { + var e_1, _a; + + _this.reverseAssetMap = {}; - try { - for (var _b = __values(Object.keys(this.assetMap)), _c = _b.next(); !_c.done; _c = _b.next()) { - var walletCurrencySymbol = _c.value; - this.reverseAssetMap[this.assetMap[walletCurrencySymbol]] = walletCurrencySymbol; - } - } catch (e_1_1) { - e_1 = { - error: e_1_1 - }; - } finally { try { - if (_c && !_c.done && (_a = _b.return)) _a.call(_b); + for (var _b = __values(Object.keys(_this.assetMap)), _c = _b.next(); !_c.done; _c = _b.next()) { + var walletCurrencySymbol = _c.value; + _this.reverseAssetMap[_this.assetMap[walletCurrencySymbol]] = walletCurrencySymbol; + } + } catch (e_1_1) { + e_1 = { + error: e_1_1 + }; } finally { - if (e_1) throw e_1.error; + try { + if (_c && !_c.done && (_a = _b.return)) _a.call(_b); + } finally { + if (e_1) throw e_1.error; + } } - } + }; + + this.setAssetList = function (assetList) { + _cruxSpec.CruxSpec.validations.validateAssetList(assetList); + + _this.assetList = assetList; + }; + + this.setAssetList(assetList); + this.setAssetMap(assetMapping); + this.setReverseAssetMap(assetMapping); + log.debug("CruxAssetTranslator initialised"); } Object.defineProperty(CruxAssetTranslator.prototype, "assetMapping", { @@ -7472,6 +7512,14 @@ function () { return this.assetMap[currencySymbol]; }; + CruxAssetTranslator.prototype.symbolToAsset = function (currencySymbol) { + var _this = this; + + return this.assetList.find(function (asset) { + return asset.assetId === _this.symbolToAssetId(currencySymbol); + }); + }; + CruxAssetTranslator.prototype.assetIdToSymbol = function (assetId) { return this.reverseAssetMap[assetId]; }; @@ -7582,302 +7630,719 @@ function () { }(); exports.CruxAssetTranslator = CruxAssetTranslator; -},{"../../core/entities/crux-spec":"Zk7e","../../packages/error":"yXIU","../../packages/logger":"eThb"}],"zwk0":[function(require,module,exports) { -var __filename = "/Users/Sanchay/Work/js-sdk/src/core/entities/crux-user.ts"; +},{"../../core/entities/crux-spec":"Zk7e","../../packages/error":"yXIU","../../packages/logger":"eThb"}],"KZir":[function(require,module,exports) { +var __filename = "/Users/Sanchay/Work/js-sdk/src/packages/storage.ts"; "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.CruxUser = exports.SubdomainRegistrationStatusDetail = exports.SubdomainRegistrationStatus = void 0; - -var _error = require("../../packages/error"); - -var _identityUtils = require("../../packages/identity-utils"); +exports.LocalStorage = exports.StorageService = void 0; -var _logger = require("../../packages/logger"); +var _logger = require("./logger"); -var _cruxSpec = require("./crux-spec"); +var __extends = void 0 && (void 0).__extends || function () { + var _extendStatics = function extendStatics(d, b) { + _extendStatics = Object.setPrototypeOf || { + __proto__: [] + } instanceof Array && function (d, b) { + d.__proto__ = b; + } || function (d, b) { + for (var p in b) { + if (b.hasOwnProperty(p)) d[p] = b[p]; + } + }; -var log = (0, _logger.getLogger)(__filename); -var SubdomainRegistrationStatus; -exports.SubdomainRegistrationStatus = SubdomainRegistrationStatus; + return _extendStatics(d, b); + }; -(function (SubdomainRegistrationStatus) { - SubdomainRegistrationStatus["NONE"] = "NONE"; - SubdomainRegistrationStatus["PENDING"] = "PENDING"; - SubdomainRegistrationStatus["DONE"] = "DONE"; - SubdomainRegistrationStatus["REJECT"] = "REJECT"; -})(SubdomainRegistrationStatus || (exports.SubdomainRegistrationStatus = SubdomainRegistrationStatus = {})); + return function (d, b) { + _extendStatics(d, b); -var SubdomainRegistrationStatusDetail; -exports.SubdomainRegistrationStatusDetail = SubdomainRegistrationStatusDetail; + function __() { + this.constructor = d; + } -(function (SubdomainRegistrationStatusDetail) { - SubdomainRegistrationStatusDetail["NONE"] = "Subdomain not registered with this registrar."; - SubdomainRegistrationStatusDetail["PENDING_REGISTRAR"] = "Subdomain registration pending on registrar."; - SubdomainRegistrationStatusDetail["PENDING_BLOCKCHAIN"] = "Subdomain registration pending on blockchain."; - SubdomainRegistrationStatusDetail["DONE"] = "Subdomain propagated."; -})(SubdomainRegistrationStatusDetail || (exports.SubdomainRegistrationStatusDetail = SubdomainRegistrationStatusDetail = {})); + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +}(); -var CruxUser = -/** @class */ -function () { - function CruxUser(cruxID, addressMap, cruxUserInformation) { - var _this = this; +var __awaiter = void 0 && (void 0).__awaiter || function (thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function (resolve) { + resolve(value); + }); + } - this.setCruxUserID = function (cruxID) { - if (cruxID instanceof _identityUtils.CruxId) { - _this.cruxUserID = cruxID; - } else { - throw new _error.BaseError(null, "Invalid CruxID"); + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); } - }; + } - this.setCruxUserInformation = function (cruxUserInformation) { - // validate and set the cruxUserInformation - if (!Object.values(SubdomainRegistrationStatus).includes(cruxUserInformation.registrationStatus.status)) { - throw new _error.BaseError(null, "Subdomain registration status validation failed!"); + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); } + } - if (!Object.values(SubdomainRegistrationStatusDetail).includes(cruxUserInformation.registrationStatus.statusDetail)) { - throw new _error.BaseError(null, "Subdomain registration status detail validation failed!"); - } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } - _this.cruxUserInformation = cruxUserInformation; - }; + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; - this.setCruxUserID(cruxID); - this.setAddressMap(addressMap); - this.setCruxUserInformation(cruxUserInformation); - log.debug("CruxUser initialised"); +var __generator = void 0 && (void 0).__generator || function (thisArg, body) { + var _ = { + label: 0, + sent: function sent() { + if (t[0] & 1) throw t[1]; + return t[1]; + }, + trys: [], + ops: [] + }, + f, + y, + t, + g; + return g = { + next: verb(0), + "throw": verb(1), + "return": verb(2) + }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { + return this; + }), g; + + function verb(n) { + return function (v) { + return step([n, v]); + }; } - Object.defineProperty(CruxUser.prototype, "cruxID", { - get: function get() { - return this.cruxUserID; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(CruxUser.prototype, "info", { - get: function get() { - return this.cruxUserInformation; - }, - enumerable: true, - configurable: true - }); + function step(op) { + if (f) throw new TypeError("Generator is already executing."); - CruxUser.prototype.getAddressMap = function () { - return this.addressMap; - }; + while (_) { + try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; - CruxUser.prototype.setAddressMap = function (addressMap) { - try { - _cruxSpec.CruxSpec.validations.validateAssetIdAddressMap(addressMap); - } catch (error) { - throw new _error.BaseError(error, "Address Map validation failed!"); - } + switch (op[0]) { + case 0: + case 1: + t = op; + break; - this.addressMap = addressMap; - }; + case 4: + _.label++; + return { + value: op[1], + done: false + }; - CruxUser.prototype.getAddressFromAsset = function (assetId) { - return this.addressMap[assetId]; - }; + case 5: + _.label++; + y = op[1]; + op = [0]; + continue; - return CruxUser; -}(); + case 7: + op = _.ops.pop(); -exports.CruxUser = CruxUser; -},{"../../packages/error":"yXIU","../../packages/identity-utils":"j93N","../../packages/logger":"eThb","./crux-spec":"Zk7e"}],"d8Gn":[function(require,module,exports) { -"use strict"; + _.trys.pop(); -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.isInstanceOfKeyManager = void 0; + continue; -var isInstanceOfKeyManager = function isInstanceOfKeyManager(object) { - if ("getPubKey" in object && typeof object.getPubKey === "function" && "signWebToken" in object && typeof object.signWebToken === "function") { - return true; - } else { - return false; - } -}; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { + _ = 0; + continue; + } -exports.isInstanceOfKeyManager = isInstanceOfKeyManager; -},{}],"yh9p":[function(require,module,exports) { -'use strict' + if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) { + _.label = op[1]; + break; + } -exports.byteLength = byteLength -exports.toByteArray = toByteArray -exports.fromByteArray = fromByteArray + if (op[0] === 6 && _.label < t[1]) { + _.label = t[1]; + t = op; + break; + } -var lookup = [] -var revLookup = [] -var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array + if (t && _.label < t[2]) { + _.label = t[2]; -var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' -for (var i = 0, len = code.length; i < len; ++i) { - lookup[i] = code[i] - revLookup[code.charCodeAt(i)] = i -} + _.ops.push(op); -// Support decoding URL-safe base64 strings, as Node.js does. -// See: https://en.wikipedia.org/wiki/Base64#URL_applications -revLookup['-'.charCodeAt(0)] = 62 -revLookup['_'.charCodeAt(0)] = 63 + break; + } -function getLens (b64) { - var len = b64.length + if (t[2]) _.ops.pop(); - if (len % 4 > 0) { - throw new Error('Invalid string. Length must be a multiple of 4') + _.trys.pop(); + + continue; + } + + op = body.call(thisArg, _); + } catch (e) { + op = [6, e]; + y = 0; + } finally { + f = t = 0; + } + } + + if (op[0] & 5) throw op[1]; + return { + value: op[0] ? op[1] : void 0, + done: true + }; } +}; - // Trim off extra bytes after placeholder bytes are found - // See: https://github.com/beatgammit/base64-js/issues/42 - var validLen = b64.indexOf('=') - if (validLen === -1) validLen = len +var log = (0, _logger.getLogger)(__filename); // Storage service abstraction - var placeHoldersLen = validLen === len - ? 0 - : 4 - (validLen % 4) +/* istanbul ignore next */ - return [validLen, placeHoldersLen] -} +var StorageService = +/** @class */ +function () { + function StorageService() { + var _this = this; -// base64 is 4/3 + up to two characters of the original data -function byteLength (b64) { - var lens = getLens(b64) - var validLen = lens[0] - var placeHoldersLen = lens[1] - return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen -} + this.setItem = function (key, value) { + return __awaiter(_this, void 0, Promise, function () { + return __generator(this, function (_a) { + return [2 + /*return*/ + , undefined]; + }); + }); + }; -function _byteLength (b64, validLen, placeHoldersLen) { - return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen -} + this.getItem = function (key) { + return __awaiter(_this, void 0, Promise, function () { + return __generator(this, function (_a) { + return [2 + /*return*/ + , null]; + }); + }); + }; -function toByteArray (b64) { - var tmp - var lens = getLens(b64) - var validLen = lens[0] - var placeHoldersLen = lens[1] + this.setJSON = function (key, jsonObj) { + return __awaiter(_this, void 0, Promise, function () { + var objString; + return __generator(this, function (_a) { + objString = JSON.stringify(jsonObj); + return [2 + /*return*/ + , this.setItem(key, objString)]; + }); + }); + }; - var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen)) + this.getJSON = function (key) { + return __awaiter(_this, void 0, Promise, function () { + var objString; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + return [4 + /*yield*/ + , this.getItem(key)]; - var curByte = 0 + case 1: + objString = _a.sent(); - // if there are placeholders, only get up to the last complete 4 chars - var len = placeHoldersLen > 0 - ? validLen - 4 - : validLen + if (objString) { + return [2 + /*return*/ + , Promise.resolve(JSON.parse(objString))]; + } else { + return [2 + /*return*/ + , Promise.resolve(null)]; + } - var i - for (i = 0; i < len; i += 4) { - tmp = - (revLookup[b64.charCodeAt(i)] << 18) | - (revLookup[b64.charCodeAt(i + 1)] << 12) | - (revLookup[b64.charCodeAt(i + 2)] << 6) | - revLookup[b64.charCodeAt(i + 3)] - arr[curByte++] = (tmp >> 16) & 0xFF - arr[curByte++] = (tmp >> 8) & 0xFF - arr[curByte++] = tmp & 0xFF + return [2 + /*return*/ + ]; + } + }); + }); + }; } - if (placeHoldersLen === 2) { - tmp = - (revLookup[b64.charCodeAt(i)] << 2) | - (revLookup[b64.charCodeAt(i + 1)] >> 4) - arr[curByte++] = tmp & 0xFF - } + return StorageService; +}(); - if (placeHoldersLen === 1) { - tmp = - (revLookup[b64.charCodeAt(i)] << 10) | - (revLookup[b64.charCodeAt(i + 1)] << 4) | - (revLookup[b64.charCodeAt(i + 2)] >> 2) - arr[curByte++] = (tmp >> 8) & 0xFF - arr[curByte++] = tmp & 0xFF - } +exports.StorageService = StorageService; - return arr -} +// LocalStorage service implementation +var LocalStorage = +/** @class */ +function (_super) { + __extends(LocalStorage, _super); -function tripletToBase64 (num) { - return lookup[num >> 18 & 0x3F] + - lookup[num >> 12 & 0x3F] + - lookup[num >> 6 & 0x3F] + - lookup[num & 0x3F] -} + function LocalStorage() { + var _this = _super.call(this) || this; -function encodeChunk (uint8, start, end) { - var tmp - var output = [] - for (var i = start; i < end; i += 3) { - tmp = - ((uint8[i] << 16) & 0xFF0000) + - ((uint8[i + 1] << 8) & 0xFF00) + - (uint8[i + 2] & 0xFF) - output.push(tripletToBase64(tmp)) - } - return output.join('') -} + _this.setItem = function (key, value) { + return __awaiter(_this, void 0, Promise, function () { + return __generator(this, function (_a) { + return [2 + /*return*/ + , Promise.resolve(this.storage.setItem(key, value))]; + }); + }); + }; -function fromByteArray (uint8) { - var tmp - var len = uint8.length - var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes - var parts = [] - var maxChunkLength = 16383 // must be multiple of 3 + _this.getItem = function (key) { + return __awaiter(_this, void 0, Promise, function () { + return __generator(this, function (_a) { + return [2 + /*return*/ + , Promise.resolve(this.storage.getItem(key))]; + }); + }); + }; - // go through the array every three bytes, we'll deal with trailing stuff later - for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { - parts.push(encodeChunk( - uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength) - )) + _this.storage = localStorage; + log.debug("LocalStorage initialised"); + return _this; } - // pad the end with zeros, but make sure to not forget the extra bytes - if (extraBytes === 1) { - tmp = uint8[len - 1] - parts.push( - lookup[tmp >> 2] + - lookup[(tmp << 4) & 0x3F] + - '==' - ) - } else if (extraBytes === 2) { - tmp = (uint8[len - 2] << 8) + uint8[len - 1] - parts.push( - lookup[tmp >> 10] + - lookup[(tmp >> 4) & 0x3F] + - lookup[(tmp << 2) & 0x3F] + - '=' - ) - } + return LocalStorage; +}(StorageService); - return parts.join('') -} +exports.LocalStorage = LocalStorage; +},{"./logger":"eThb"}],"FicS":[function(require,module,exports) { +"use strict"; -},{}],"JgNJ":[function(require,module,exports) { -exports.read = function (buffer, offset, isLE, mLen, nBytes) { - var e, m - var eLen = (nBytes * 8) - mLen - 1 - var eMax = (1 << eLen) - 1 - var eBias = eMax >> 1 - var nBits = -7 - var i = isLE ? (nBytes - 1) : 0 - var d = isLE ? -1 : 1 - var s = buffer[offset + i] +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.InMemStorage = void 0; - i += d +var _storage = require("./storage"); - e = s & ((1 << (-nBits)) - 1) - s >>= (-nBits) - nBits += eLen - for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {} +var __extends = void 0 && (void 0).__extends || function () { + var _extendStatics = function extendStatics(d, b) { + _extendStatics = Object.setPrototypeOf || { + __proto__: [] + } instanceof Array && function (d, b) { + d.__proto__ = b; + } || function (d, b) { + for (var p in b) { + if (b.hasOwnProperty(p)) d[p] = b[p]; + } + }; + + return _extendStatics(d, b); + }; + + return function (d, b) { + _extendStatics(d, b); + + function __() { + this.constructor = d; + } + + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +}(); + +var __awaiter = void 0 && (void 0).__awaiter || function (thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function (resolve) { + resolve(value); + }); + } + + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; + +var __generator = void 0 && (void 0).__generator || function (thisArg, body) { + var _ = { + label: 0, + sent: function sent() { + if (t[0] & 1) throw t[1]; + return t[1]; + }, + trys: [], + ops: [] + }, + f, + y, + t, + g; + return g = { + next: verb(0), + "throw": verb(1), + "return": verb(2) + }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { + return this; + }), g; + + function verb(n) { + return function (v) { + return step([n, v]); + }; + } + + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + + while (_) { + try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + + switch (op[0]) { + case 0: + case 1: + t = op; + break; + + case 4: + _.label++; + return { + value: op[1], + done: false + }; + + case 5: + _.label++; + y = op[1]; + op = [0]; + continue; + + case 7: + op = _.ops.pop(); + + _.trys.pop(); + + continue; + + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { + _ = 0; + continue; + } + + if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) { + _.label = op[1]; + break; + } + + if (op[0] === 6 && _.label < t[1]) { + _.label = t[1]; + t = op; + break; + } + + if (t && _.label < t[2]) { + _.label = t[2]; + + _.ops.push(op); + + break; + } + + if (t[2]) _.ops.pop(); + + _.trys.pop(); + + continue; + } + + op = body.call(thisArg, _); + } catch (e) { + op = [6, e]; + y = 0; + } finally { + f = t = 0; + } + } + + if (op[0] & 5) throw op[1]; + return { + value: op[0] ? op[1] : void 0, + done: true + }; + } +}; + +var InMemStorage = +/** @class */ +function (_super) { + __extends(InMemStorage, _super); + + function InMemStorage() { + var _this = _super.call(this) || this; + + _this.setItem = function (key, value) { + return __awaiter(_this, void 0, Promise, function () { + return __generator(this, function (_a) { + this.dataMemory[key] = value; + return [2 + /*return*/ + ]; + }); + }); + }; + + _this.getItem = function (key) { + return __awaiter(_this, void 0, Promise, function () { + return __generator(this, function (_a) { + return [2 + /*return*/ + , this.dataMemory[key]]; + }); + }); + }; + + _this.dataMemory = {}; + return _this; + } + + return InMemStorage; +}(_storage.StorageService); + +exports.InMemStorage = InMemStorage; +},{"./storage":"KZir"}],"Bm0n":[function(require,module,exports) { +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }) + } + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } + } +} + +},{}],"yh9p":[function(require,module,exports) { +'use strict' + +exports.byteLength = byteLength +exports.toByteArray = toByteArray +exports.fromByteArray = fromByteArray + +var lookup = [] +var revLookup = [] +var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array + +var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' +for (var i = 0, len = code.length; i < len; ++i) { + lookup[i] = code[i] + revLookup[code.charCodeAt(i)] = i +} + +// Support decoding URL-safe base64 strings, as Node.js does. +// See: https://en.wikipedia.org/wiki/Base64#URL_applications +revLookup['-'.charCodeAt(0)] = 62 +revLookup['_'.charCodeAt(0)] = 63 + +function getLens (b64) { + var len = b64.length + + if (len % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4') + } + + // Trim off extra bytes after placeholder bytes are found + // See: https://github.com/beatgammit/base64-js/issues/42 + var validLen = b64.indexOf('=') + if (validLen === -1) validLen = len + + var placeHoldersLen = validLen === len + ? 0 + : 4 - (validLen % 4) + + return [validLen, placeHoldersLen] +} + +// base64 is 4/3 + up to two characters of the original data +function byteLength (b64) { + var lens = getLens(b64) + var validLen = lens[0] + var placeHoldersLen = lens[1] + return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen +} + +function _byteLength (b64, validLen, placeHoldersLen) { + return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen +} + +function toByteArray (b64) { + var tmp + var lens = getLens(b64) + var validLen = lens[0] + var placeHoldersLen = lens[1] + + var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen)) + + var curByte = 0 + + // if there are placeholders, only get up to the last complete 4 chars + var len = placeHoldersLen > 0 + ? validLen - 4 + : validLen + + var i + for (i = 0; i < len; i += 4) { + tmp = + (revLookup[b64.charCodeAt(i)] << 18) | + (revLookup[b64.charCodeAt(i + 1)] << 12) | + (revLookup[b64.charCodeAt(i + 2)] << 6) | + revLookup[b64.charCodeAt(i + 3)] + arr[curByte++] = (tmp >> 16) & 0xFF + arr[curByte++] = (tmp >> 8) & 0xFF + arr[curByte++] = tmp & 0xFF + } + + if (placeHoldersLen === 2) { + tmp = + (revLookup[b64.charCodeAt(i)] << 2) | + (revLookup[b64.charCodeAt(i + 1)] >> 4) + arr[curByte++] = tmp & 0xFF + } + + if (placeHoldersLen === 1) { + tmp = + (revLookup[b64.charCodeAt(i)] << 10) | + (revLookup[b64.charCodeAt(i + 1)] << 4) | + (revLookup[b64.charCodeAt(i + 2)] >> 2) + arr[curByte++] = (tmp >> 8) & 0xFF + arr[curByte++] = tmp & 0xFF + } + + return arr +} + +function tripletToBase64 (num) { + return lookup[num >> 18 & 0x3F] + + lookup[num >> 12 & 0x3F] + + lookup[num >> 6 & 0x3F] + + lookup[num & 0x3F] +} + +function encodeChunk (uint8, start, end) { + var tmp + var output = [] + for (var i = start; i < end; i += 3) { + tmp = + ((uint8[i] << 16) & 0xFF0000) + + ((uint8[i + 1] << 8) & 0xFF00) + + (uint8[i + 2] & 0xFF) + output.push(tripletToBase64(tmp)) + } + return output.join('') +} + +function fromByteArray (uint8) { + var tmp + var len = uint8.length + var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes + var parts = [] + var maxChunkLength = 16383 // must be multiple of 3 + + // go through the array every three bytes, we'll deal with trailing stuff later + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { + parts.push(encodeChunk( + uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength) + )) + } + + // pad the end with zeros, but make sure to not forget the extra bytes + if (extraBytes === 1) { + tmp = uint8[len - 1] + parts.push( + lookup[tmp >> 2] + + lookup[(tmp << 4) & 0x3F] + + '==' + ) + } else if (extraBytes === 2) { + tmp = (uint8[len - 2] << 8) + uint8[len - 1] + parts.push( + lookup[tmp >> 10] + + lookup[(tmp >> 4) & 0x3F] + + lookup[(tmp << 2) & 0x3F] + + '=' + ) + } + + return parts.join('') +} + +},{}],"JgNJ":[function(require,module,exports) { +exports.read = function (buffer, offset, isLE, mLen, nBytes) { + var e, m + var eLen = (nBytes * 8) - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var nBits = -7 + var i = isLE ? (nBytes - 1) : 0 + var d = isLE ? -1 : 1 + var s = buffer[offset + i] + + i += d + + e = s & ((1 << (-nBits)) - 1) + s >>= (-nBits) + nBits += eLen + for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {} m = e & ((1 << (-nBits)) - 1) e >>= (-nBits) @@ -9747,101783 +10212,99415 @@ function isnan (val) { return val !== val // eslint-disable-line no-self-compare } -},{"base64-js":"yh9p","ieee754":"JgNJ","isarray":"REa7","buffer":"dskh"}],"hgKi":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -function padString(input) { - var segmentLength = 4; - var stringLength = input.length; - var diff = stringLength % segmentLength; - - if (!diff) { - return input; - } +},{"base64-js":"yh9p","ieee754":"JgNJ","isarray":"REa7","buffer":"dskh"}],"Wugr":[function(require,module,exports) { - var position = stringLength; - var padLength = segmentLength - diff; - var paddedStringLength = stringLength + padLength; - var buffer = Buffer.alloc(paddedStringLength); - buffer.write(input); +/* eslint-disable node/no-deprecated-api */ +var buffer = require('buffer') +var Buffer = buffer.Buffer - while (padLength--) { - buffer.write("=", position++); +// alternative to using Object.keys for old browsers +function copyProps (src, dst) { + for (var key in src) { + dst[key] = src[key] } +} +if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { + module.exports = buffer +} else { + // Copy properties from require('buffer') + copyProps(buffer, exports) + exports.Buffer = SafeBuffer +} - return buffer.toString(); +function SafeBuffer (arg, encodingOrOffset, length) { + return Buffer(arg, encodingOrOffset, length) } -exports.default = padString; -},{"buffer":"dskh"}],"oNlT":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -"use strict"; +SafeBuffer.prototype = Object.create(Buffer.prototype) -Object.defineProperty(exports, "__esModule", { - value: true -}); +// Copy static methods from Buffer +copyProps(Buffer, SafeBuffer) -var pad_string_1 = require("./pad-string"); +SafeBuffer.from = function (arg, encodingOrOffset, length) { + if (typeof arg === 'number') { + throw new TypeError('Argument must not be a number') + } + return Buffer(arg, encodingOrOffset, length) +} -function encode(input, encoding) { - if (encoding === void 0) { - encoding = "utf8"; +SafeBuffer.alloc = function (size, fill, encoding) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + var buf = Buffer(size) + if (fill !== undefined) { + if (typeof encoding === 'string') { + buf.fill(fill, encoding) + } else { + buf.fill(fill) + } + } else { + buf.fill(0) } + return buf +} - if (Buffer.isBuffer(input)) { - return fromBase64(input.toString("base64")); +SafeBuffer.allocUnsafe = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') } + return Buffer(size) +} - return fromBase64(Buffer.from(input, encoding).toString("base64")); +SafeBuffer.allocUnsafeSlow = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return buffer.SlowBuffer(size) } -; +},{"buffer":"dskh"}],"FRpO":[function(require,module,exports) { +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. +'use strict'; -function decode(base64url, encoding) { - if (encoding === void 0) { - encoding = "utf8"; - } +var R = typeof Reflect === 'object' ? Reflect : null; +var ReflectApply = R && typeof R.apply === 'function' ? R.apply : function ReflectApply(target, receiver, args) { + return Function.prototype.apply.call(target, receiver, args); +}; +var ReflectOwnKeys; - return Buffer.from(toBase64(base64url), "base64").toString(encoding); +if (R && typeof R.ownKeys === 'function') { + ReflectOwnKeys = R.ownKeys; +} else if (Object.getOwnPropertySymbols) { + ReflectOwnKeys = function ReflectOwnKeys(target) { + return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target)); + }; +} else { + ReflectOwnKeys = function ReflectOwnKeys(target) { + return Object.getOwnPropertyNames(target); + }; } -function toBase64(base64url) { - base64url = base64url.toString(); - return pad_string_1.default(base64url).replace(/\-/g, "+").replace(/_/g, "/"); +function ProcessEmitWarning(warning) { + if (console && console.warn) console.warn(warning); } -function fromBase64(base64) { - return base64.replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_"); -} +var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) { + return value !== value; +}; -function toBuffer(base64url) { - return Buffer.from(toBase64(base64url), "base64"); +function EventEmitter() { + EventEmitter.init.call(this); } -var base64url = encode; -base64url.encode = encode; -base64url.decode = decode; -base64url.toBase64 = toBase64; -base64url.fromBase64 = fromBase64; -base64url.toBuffer = toBuffer; -exports.default = base64url; -},{"./pad-string":"hgKi","buffer":"dskh"}],"XVTP":[function(require,module,exports) { -module.exports = require('./dist/base64url').default; -module.exports.default = module.exports; -},{"./dist/base64url":"oNlT"}],"bNi7":[function(require,module,exports) { -module.exports = { - "_args": [ - [ - "elliptic@6.5.0", - "/Users/Sanchay/Work/js-sdk" - ] - ], - "_from": "elliptic@6.5.0", - "_id": "elliptic@6.5.0", - "_inBundle": false, - "_integrity": "sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg==", - "_location": "/elliptic", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "elliptic@6.5.0", - "name": "elliptic", - "escapedName": "elliptic", - "rawSpec": "6.5.0", - "saveSpec": null, - "fetchSpec": "6.5.0" - }, - "_requiredBy": [ - "/blockstack", - "/blockstack/jsontokens", - "/browserify-sign", - "/create-ecdh", - "/jsontokens", - "/jsontokens/key-encoder", - "/key-encoder", - "/tiny-secp256k1" - ], - "_resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.0.tgz", - "_spec": "6.5.0", - "_where": "/Users/Sanchay/Work/js-sdk", - "author": { - "name": "Fedor Indutny", - "email": "fedor@indutny.com" - }, - "bugs": { - "url": "https://github.com/indutny/elliptic/issues" - }, - "dependencies": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - }, - "description": "EC cryptography", - "devDependencies": { - "brfs": "^1.4.3", - "coveralls": "^2.11.3", - "grunt": "^0.4.5", - "grunt-browserify": "^5.0.0", - "grunt-cli": "^1.2.0", - "grunt-contrib-connect": "^1.0.0", - "grunt-contrib-copy": "^1.0.0", - "grunt-contrib-uglify": "^1.0.1", - "grunt-mocha-istanbul": "^3.0.1", - "grunt-saucelabs": "^8.6.2", - "istanbul": "^0.4.2", - "jscs": "^2.9.0", - "jshint": "^2.6.0", - "mocha": "^2.1.0" - }, - "files": [ - "lib" - ], - "homepage": "https://github.com/indutny/elliptic", - "keywords": [ - "EC", - "Elliptic", - "curve", - "Cryptography" - ], - "license": "MIT", - "main": "lib/elliptic.js", - "name": "elliptic", - "repository": { - "type": "git", - "url": "git+ssh://git@github.com/indutny/elliptic.git" - }, - "scripts": { - "jscs": "jscs benchmarks/*.js lib/*.js lib/**/*.js lib/**/**/*.js test/index.js", - "jshint": "jscs benchmarks/*.js lib/*.js lib/**/*.js lib/**/**/*.js test/index.js", - "lint": "npm run jscs && npm run jshint", - "test": "npm run lint && npm run unit", - "unit": "istanbul test _mocha --reporter=spec test/index.js", - "version": "grunt dist && git add dist/" +module.exports = EventEmitter; // Backwards-compat with node 0.10.x + +EventEmitter.EventEmitter = EventEmitter; +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._eventsCount = 0; +EventEmitter.prototype._maxListeners = undefined; // By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. + +var defaultMaxListeners = 10; +Object.defineProperty(EventEmitter, 'defaultMaxListeners', { + enumerable: true, + get: function () { + return defaultMaxListeners; }, - "version": "6.5.0" -} -; -},{}],"rDCW":[function(require,module,exports) { + set: function (arg) { + if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) { + throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.'); + } -},{}],"BOxy":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -(function (module, exports) { - 'use strict'; + defaultMaxListeners = arg; + } +}); - // Utils - function assert (val, msg) { - if (!val) throw new Error(msg || 'Assertion failed'); +EventEmitter.init = function () { + if (this._events === undefined || this._events === Object.getPrototypeOf(this)._events) { + this._events = Object.create(null); + this._eventsCount = 0; } - // Could use `inherits` module, but don't want to move from single file - // architecture yet. - function inherits (ctor, superCtor) { - ctor.super_ = superCtor; - var TempCtor = function () {}; - TempCtor.prototype = superCtor.prototype; - ctor.prototype = new TempCtor(); - ctor.prototype.constructor = ctor; + this._maxListeners = this._maxListeners || undefined; +}; // Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. + + +EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { + if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) { + throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.'); } - // BN + this._maxListeners = n; + return this; +}; - function BN (number, base, endian) { - if (BN.isBN(number)) { - return number; - } +function $getMaxListeners(that) { + if (that._maxListeners === undefined) return EventEmitter.defaultMaxListeners; + return that._maxListeners; +} - this.negative = 0; - this.words = null; - this.length = 0; +EventEmitter.prototype.getMaxListeners = function getMaxListeners() { + return $getMaxListeners(this); +}; - // Reduction context - this.red = null; +EventEmitter.prototype.emit = function emit(type) { + var args = []; - if (number !== null) { - if (base === 'le' || base === 'be') { - endian = base; - base = 10; - } + for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); - this._init(number || 0, base || 10, endian || 'be'); - } + var doError = type === 'error'; + var events = this._events; + if (events !== undefined) doError = doError && events.error === undefined;else if (!doError) return false; // If there is no 'error' event listener then throw. + + if (doError) { + var er; + if (args.length > 0) er = args[0]; + + if (er instanceof Error) { + // Note: The comments on the `throw` lines are intentional, they show + // up in Node's output if this results in an unhandled exception. + throw er; // Unhandled 'error' event + } // At least give some kind of context to the user + + + var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : '')); + err.context = er; + throw err; // Unhandled 'error' event } - if (typeof module === 'object') { - module.exports = BN; + + var handler = events[type]; + if (handler === undefined) return false; + + if (typeof handler === 'function') { + ReflectApply(handler, this, args); } else { - exports.BN = BN; + var len = handler.length; + var listeners = arrayClone(handler, len); + + for (var i = 0; i < len; ++i) ReflectApply(listeners[i], this, args); } - BN.BN = BN; - BN.wordSize = 26; + return true; +}; - var Buffer; - try { - Buffer = require('buffer').Buffer; - } catch (e) { +function _addListener(target, type, listener, prepend) { + var m; + var events; + var existing; + + if (typeof listener !== 'function') { + throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); } - BN.isBN = function isBN (num) { - if (num instanceof BN) { - return true; - } + events = target._events; - return num !== null && typeof num === 'object' && - num.constructor.wordSize === BN.wordSize && Array.isArray(num.words); - }; + if (events === undefined) { + events = target._events = Object.create(null); + target._eventsCount = 0; + } else { + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (events.newListener !== undefined) { + target.emit('newListener', type, listener.listener ? listener.listener : listener); // Re-assign `events` because a newListener handler could have caused the + // this._events to be assigned to a new object - BN.max = function max (left, right) { - if (left.cmp(right) > 0) return left; - return right; - }; + events = target._events; + } - BN.min = function min (left, right) { - if (left.cmp(right) < 0) return left; - return right; - }; + existing = events[type]; + } - BN.prototype._init = function init (number, base, endian) { - if (typeof number === 'number') { - return this._initNumber(number, base, endian); - } + if (existing === undefined) { + // Optimize the case of one listener. Don't need the extra array object. + existing = events[type] = listener; + ++target._eventsCount; + } else { + if (typeof existing === 'function') { + // Adding the second element, need to change to array. + existing = events[type] = prepend ? [listener, existing] : [existing, listener]; // If we've already got an array, just append. + } else if (prepend) { + existing.unshift(listener); + } else { + existing.push(listener); + } // Check for listener leak - if (typeof number === 'object') { - return this._initArray(number, base, endian); - } - if (base === 'hex') { - base = 16; - } - assert(base === (base | 0) && base >= 2 && base <= 36); + m = $getMaxListeners(target); - number = number.toString().replace(/\s+/g, ''); - var start = 0; - if (number[0] === '-') { - start++; - } + if (m > 0 && existing.length > m && !existing.warned) { + existing.warned = true; // No error code for this since it is a Warning + // eslint-disable-next-line no-restricted-syntax - if (base === 16) { - this._parseHex(number, start); - } else { - this._parseBase(number, base, start); + var w = new Error('Possible EventEmitter memory leak detected. ' + existing.length + ' ' + String(type) + ' listeners ' + 'added. Use emitter.setMaxListeners() to ' + 'increase limit'); + w.name = 'MaxListenersExceededWarning'; + w.emitter = target; + w.type = type; + w.count = existing.length; + ProcessEmitWarning(w); } + } - if (number[0] === '-') { - this.negative = 1; - } + return target; +} - this.strip(); +EventEmitter.prototype.addListener = function addListener(type, listener) { + return _addListener(this, type, listener, false); +}; - if (endian !== 'le') return; +EventEmitter.prototype.on = EventEmitter.prototype.addListener; - this._initArray(this.toArray(), base, endian); - }; +EventEmitter.prototype.prependListener = function prependListener(type, listener) { + return _addListener(this, type, listener, true); +}; - BN.prototype._initNumber = function _initNumber (number, base, endian) { - if (number < 0) { - this.negative = 1; - number = -number; - } - if (number < 0x4000000) { - this.words = [ number & 0x3ffffff ]; - this.length = 1; - } else if (number < 0x10000000000000) { - this.words = [ - number & 0x3ffffff, - (number / 0x4000000) & 0x3ffffff - ]; - this.length = 2; - } else { - assert(number < 0x20000000000000); // 2 ^ 53 (unsafe) - this.words = [ - number & 0x3ffffff, - (number / 0x4000000) & 0x3ffffff, - 1 - ]; - this.length = 3; - } +function onceWrapper() { + var args = []; - if (endian !== 'le') return; + for (var i = 0; i < arguments.length; i++) args.push(arguments[i]); - // Reverse the bytes - this._initArray(this.toArray(), base, endian); + if (!this.fired) { + this.target.removeListener(this.type, this.wrapFn); + this.fired = true; + ReflectApply(this.listener, this.target, args); + } +} + +function _onceWrap(target, type, listener) { + var state = { + fired: false, + wrapFn: undefined, + target: target, + type: type, + listener: listener }; + var wrapped = onceWrapper.bind(state); + wrapped.listener = listener; + state.wrapFn = wrapped; + return wrapped; +} - BN.prototype._initArray = function _initArray (number, base, endian) { - // Perhaps a Uint8Array - assert(typeof number.length === 'number'); - if (number.length <= 0) { - this.words = [ 0 ]; - this.length = 1; - return this; - } - - this.length = Math.ceil(number.length / 3); - this.words = new Array(this.length); - for (var i = 0; i < this.length; i++) { - this.words[i] = 0; - } +EventEmitter.prototype.once = function once(type, listener) { + if (typeof listener !== 'function') { + throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); + } - var j, w; - var off = 0; - if (endian === 'be') { - for (i = number.length - 1, j = 0; i >= 0; i -= 3) { - w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16); - this.words[j] |= (w << off) & 0x3ffffff; - this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff; - off += 24; - if (off >= 26) { - off -= 26; - j++; - } - } - } else if (endian === 'le') { - for (i = 0, j = 0; i < number.length; i += 3) { - w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16); - this.words[j] |= (w << off) & 0x3ffffff; - this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff; - off += 24; - if (off >= 26) { - off -= 26; - j++; - } - } - } - return this.strip(); - }; + this.on(type, _onceWrap(this, type, listener)); + return this; +}; - function parseHex (str, start, end) { - var r = 0; - var len = Math.min(str.length, end); - for (var i = start; i < len; i++) { - var c = str.charCodeAt(i) - 48; +EventEmitter.prototype.prependOnceListener = function prependOnceListener(type, listener) { + if (typeof listener !== 'function') { + throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); + } - r <<= 4; + this.prependListener(type, _onceWrap(this, type, listener)); + return this; +}; // Emits a 'removeListener' event if and only if the listener was removed. - // 'a' - 'f' - if (c >= 49 && c <= 54) { - r |= c - 49 + 0xa; - // 'A' - 'F' - } else if (c >= 17 && c <= 22) { - r |= c - 17 + 0xa; +EventEmitter.prototype.removeListener = function removeListener(type, listener) { + var list, events, position, i, originalListener; - // '0' - '9' - } else { - r |= c & 0xf; - } - } - return r; + if (typeof listener !== 'function') { + throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); } - BN.prototype._parseHex = function _parseHex (number, start) { - // Create possibly bigger array to ensure that it fits the number - this.length = Math.ceil((number.length - start) / 6); - this.words = new Array(this.length); - for (var i = 0; i < this.length; i++) { - this.words[i] = 0; + events = this._events; + if (events === undefined) return this; + list = events[type]; + if (list === undefined) return this; + + if (list === listener || list.listener === listener) { + if (--this._eventsCount === 0) this._events = Object.create(null);else { + delete events[type]; + if (events.removeListener) this.emit('removeListener', type, list.listener || listener); } + } else if (typeof list !== 'function') { + position = -1; - var j, w; - // Scan 24-bit chunks and add them to the number - var off = 0; - for (i = number.length - 6, j = 0; i >= start; i -= 6) { - w = parseHex(number, i, i + 6); - this.words[j] |= (w << off) & 0x3ffffff; - // NOTE: `0x3fffff` is intentional here, 26bits max shift + 24bit hex limb - this.words[j + 1] |= w >>> (26 - off) & 0x3fffff; - off += 24; - if (off >= 26) { - off -= 26; - j++; + for (i = list.length - 1; i >= 0; i--) { + if (list[i] === listener || list[i].listener === listener) { + originalListener = list[i].listener; + position = i; + break; } } - if (i + 6 !== start) { - w = parseHex(number, start, i + 6); - this.words[j] |= (w << off) & 0x3ffffff; - this.words[j + 1] |= w >>> (26 - off) & 0x3fffff; - } - this.strip(); - }; - function parseBase (str, start, end, mul) { - var r = 0; - var len = Math.min(str.length, end); - for (var i = start; i < len; i++) { - var c = str.charCodeAt(i) - 48; + if (position < 0) return this; + if (position === 0) list.shift();else { + spliceOne(list, position); + } + if (list.length === 1) events[type] = list[0]; + if (events.removeListener !== undefined) this.emit('removeListener', type, originalListener || listener); + } - r *= mul; + return this; +}; - // 'a' - if (c >= 49) { - r += c - 49 + 0xa; +EventEmitter.prototype.off = EventEmitter.prototype.removeListener; - // 'A' - } else if (c >= 17) { - r += c - 17 + 0xa; +EventEmitter.prototype.removeAllListeners = function removeAllListeners(type) { + var listeners, events, i; + events = this._events; + if (events === undefined) return this; // not listening for removeListener, no need to emit - // '0' - '9' - } else { - r += c; - } + if (events.removeListener === undefined) { + if (arguments.length === 0) { + this._events = Object.create(null); + this._eventsCount = 0; + } else if (events[type] !== undefined) { + if (--this._eventsCount === 0) this._events = Object.create(null);else delete events[type]; } - return r; - } - BN.prototype._parseBase = function _parseBase (number, base, start) { - // Initialize as zero - this.words = [ 0 ]; - this.length = 1; - - // Find length of limb in base - for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) { - limbLen++; - } - limbLen--; - limbPow = (limbPow / base) | 0; + return this; + } // emit removeListener for all listeners on all events - var total = number.length - start; - var mod = total % limbLen; - var end = Math.min(total, total - mod) + start; - var word = 0; - for (var i = start; i < end; i += limbLen) { - word = parseBase(number, i, i + limbLen, base); + if (arguments.length === 0) { + var keys = Object.keys(events); + var key; - this.imuln(limbPow); - if (this.words[0] + word < 0x4000000) { - this.words[0] += word; - } else { - this._iaddn(word); - } + for (i = 0; i < keys.length; ++i) { + key = keys[i]; + if (key === 'removeListener') continue; + this.removeAllListeners(key); } - if (mod !== 0) { - var pow = 1; - word = parseBase(number, i, number.length, base); + this.removeAllListeners('removeListener'); + this._events = Object.create(null); + this._eventsCount = 0; + return this; + } - for (i = 0; i < mod; i++) { - pow *= base; - } + listeners = events[type]; - this.imuln(pow); - if (this.words[0] + word < 0x4000000) { - this.words[0] += word; - } else { - this._iaddn(word); - } + if (typeof listeners === 'function') { + this.removeListener(type, listeners); + } else if (listeners !== undefined) { + // LIFO order + for (i = listeners.length - 1; i >= 0; i--) { + this.removeListener(type, listeners[i]); } - }; + } - BN.prototype.copy = function copy (dest) { - dest.words = new Array(this.length); - for (var i = 0; i < this.length; i++) { - dest.words[i] = this.words[i]; - } - dest.length = this.length; - dest.negative = this.negative; - dest.red = this.red; - }; + return this; +}; - BN.prototype.clone = function clone () { - var r = new BN(null); - this.copy(r); - return r; - }; +function _listeners(target, type, unwrap) { + var events = target._events; + if (events === undefined) return []; + var evlistener = events[type]; + if (evlistener === undefined) return []; + if (typeof evlistener === 'function') return unwrap ? [evlistener.listener || evlistener] : [evlistener]; + return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); +} - BN.prototype._expand = function _expand (size) { - while (this.length < size) { - this.words[this.length++] = 0; - } - return this; - }; +EventEmitter.prototype.listeners = function listeners(type) { + return _listeners(this, type, true); +}; - // Remove leading `0` from `this` - BN.prototype.strip = function strip () { - while (this.length > 1 && this.words[this.length - 1] === 0) { - this.length--; - } - return this._normSign(); - }; +EventEmitter.prototype.rawListeners = function rawListeners(type) { + return _listeners(this, type, false); +}; - BN.prototype._normSign = function _normSign () { - // -0 = 0 - if (this.length === 1 && this.words[0] === 0) { - this.negative = 0; - } - return this; - }; +EventEmitter.listenerCount = function (emitter, type) { + if (typeof emitter.listenerCount === 'function') { + return emitter.listenerCount(type); + } else { + return listenerCount.call(emitter, type); + } +}; - BN.prototype.inspect = function inspect () { - return (this.red ? ''; - }; +EventEmitter.prototype.listenerCount = listenerCount; - /* +function listenerCount(type) { + var events = this._events; - var zeros = []; - var groupSizes = []; - var groupBases = []; + if (events !== undefined) { + var evlistener = events[type]; - var s = ''; - var i = -1; - while (++i < BN.wordSize) { - zeros[i] = s; - s += '0'; - } - groupSizes[0] = 0; - groupSizes[1] = 0; - groupBases[0] = 0; - groupBases[1] = 0; - var base = 2 - 1; - while (++base < 36 + 1) { - var groupSize = 0; - var groupBase = 1; - while (groupBase < (1 << BN.wordSize) / base) { - groupBase *= base; - groupSize += 1; + if (typeof evlistener === 'function') { + return 1; + } else if (evlistener !== undefined) { + return evlistener.length; } - groupSizes[base] = groupSize; - groupBases[base] = groupBase; } - */ + return 0; +} - var zeros = [ - '', - '0', - '00', - '000', - '0000', - '00000', - '000000', - '0000000', - '00000000', - '000000000', - '0000000000', - '00000000000', - '000000000000', - '0000000000000', - '00000000000000', - '000000000000000', - '0000000000000000', - '00000000000000000', - '000000000000000000', - '0000000000000000000', - '00000000000000000000', - '000000000000000000000', - '0000000000000000000000', - '00000000000000000000000', - '000000000000000000000000', - '0000000000000000000000000' - ]; +EventEmitter.prototype.eventNames = function eventNames() { + return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; +}; - var groupSizes = [ - 0, 0, - 25, 16, 12, 11, 10, 9, 8, - 8, 7, 7, 7, 7, 6, 6, - 6, 6, 6, 6, 6, 5, 5, - 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5 - ]; +function arrayClone(arr, n) { + var copy = new Array(n); - var groupBases = [ - 0, 0, - 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216, - 43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625, - 16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632, - 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149, - 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176 - ]; + for (var i = 0; i < n; ++i) copy[i] = arr[i]; - BN.prototype.toString = function toString (base, padding) { - base = base || 10; - padding = padding | 0 || 1; + return copy; +} - var out; - if (base === 16 || base === 'hex') { - out = ''; - var off = 0; - var carry = 0; - for (var i = 0; i < this.length; i++) { - var w = this.words[i]; - var word = (((w << off) | carry) & 0xffffff).toString(16); - carry = (w >>> (24 - off)) & 0xffffff; - if (carry !== 0 || i !== this.length - 1) { - out = zeros[6 - word.length] + word + out; - } else { - out = word + out; - } - off += 2; - if (off >= 26) { - off -= 26; - i--; - } - } - if (carry !== 0) { - out = carry.toString(16) + out; - } - while (out.length % padding !== 0) { - out = '0' + out; - } - if (this.negative !== 0) { - out = '-' + out; - } - return out; - } +function spliceOne(list, index) { + for (; index + 1 < list.length; index++) list[index] = list[index + 1]; - if (base === (base | 0) && base >= 2 && base <= 36) { - // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base)); - var groupSize = groupSizes[base]; - // var groupBase = Math.pow(base, groupSize); - var groupBase = groupBases[base]; - out = ''; - var c = this.clone(); - c.negative = 0; - while (!c.isZero()) { - var r = c.modn(groupBase).toString(base); - c = c.idivn(groupBase); + list.pop(); +} - if (!c.isZero()) { - out = zeros[groupSize - r.length] + r + out; - } else { - out = r + out; - } - } - if (this.isZero()) { - out = '0' + out; - } - while (out.length % padding !== 0) { - out = '0' + out; - } - if (this.negative !== 0) { - out = '-' + out; - } - return out; - } +function unwrapListeners(arr) { + var ret = new Array(arr.length); - assert(false, 'Base should be between 2 and 36'); - }; + for (var i = 0; i < ret.length; ++i) { + ret[i] = arr[i].listener || arr[i]; + } - BN.prototype.toNumber = function toNumber () { - var ret = this.words[0]; - if (this.length === 2) { - ret += this.words[1] * 0x4000000; - } else if (this.length === 3 && this.words[2] === 0x01) { - // NOTE: at this stage it is known that the top bit is set - ret += 0x10000000000000 + (this.words[1] * 0x4000000); - } else if (this.length > 2) { - assert(false, 'Number can only safely store up to 53 bits'); - } - return (this.negative !== 0) ? -ret : ret; - }; + return ret; +} +},{}],"Yj0v":[function(require,module,exports) { +var process = require("process"); +'use strict'; - BN.prototype.toJSON = function toJSON () { - return this.toString(16); - }; +if (typeof process === 'undefined' || + !process.version || + process.version.indexOf('v0.') === 0 || + process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { + module.exports = { nextTick: nextTick }; +} else { + module.exports = process +} - BN.prototype.toBuffer = function toBuffer (endian, length) { - assert(typeof Buffer !== 'undefined'); - return this.toArrayLike(Buffer, endian, length); - }; +function nextTick(fn, arg1, arg2, arg3) { + if (typeof fn !== 'function') { + throw new TypeError('"callback" argument must be a function'); + } + var len = arguments.length; + var args, i; + switch (len) { + case 0: + case 1: + return process.nextTick(fn); + case 2: + return process.nextTick(function afterTickOne() { + fn.call(null, arg1); + }); + case 3: + return process.nextTick(function afterTickTwo() { + fn.call(null, arg1, arg2); + }); + case 4: + return process.nextTick(function afterTickThree() { + fn.call(null, arg1, arg2, arg3); + }); + default: + args = new Array(len - 1); + i = 0; + while (i < args.length) { + args[i++] = arguments[i]; + } + return process.nextTick(function afterTick() { + fn.apply(null, args); + }); + } +} - BN.prototype.toArray = function toArray (endian, length) { - return this.toArrayLike(Array, endian, length); - }; - BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) { - var byteLength = this.byteLength(); - var reqLength = length || Math.max(1, byteLength); - assert(byteLength <= reqLength, 'byte array longer than desired length'); - assert(reqLength > 0, 'Requested array length <= 0'); +},{"process":"pBGv"}],"Q8A6":[function(require,module,exports) { +module.exports = require('events').EventEmitter; - this.strip(); - var littleEndian = endian === 'le'; - var res = new ArrayType(reqLength); +},{"events":"FRpO"}],"l6K0":[function(require,module,exports) { - var b, i; - var q = this.clone(); - if (!littleEndian) { - // Assume big-endian - for (i = 0; i < reqLength - byteLength; i++) { - res[i] = 0; - } +/* eslint-disable node/no-deprecated-api */ +var buffer = require('buffer') +var Buffer = buffer.Buffer - for (i = 0; !q.isZero(); i++) { - b = q.andln(0xff); - q.iushrn(8); +// alternative to using Object.keys for old browsers +function copyProps (src, dst) { + for (var key in src) { + dst[key] = src[key] + } +} +if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { + module.exports = buffer +} else { + // Copy properties from require('buffer') + copyProps(buffer, exports) + exports.Buffer = SafeBuffer +} - res[reqLength - i - 1] = b; - } - } else { - for (i = 0; !q.isZero(); i++) { - b = q.andln(0xff); - q.iushrn(8); +function SafeBuffer (arg, encodingOrOffset, length) { + return Buffer(arg, encodingOrOffset, length) +} - res[i] = b; - } +// Copy static methods from Buffer +copyProps(Buffer, SafeBuffer) - for (; i < reqLength; i++) { - res[i] = 0; - } +SafeBuffer.from = function (arg, encodingOrOffset, length) { + if (typeof arg === 'number') { + throw new TypeError('Argument must not be a number') + } + return Buffer(arg, encodingOrOffset, length) +} + +SafeBuffer.alloc = function (size, fill, encoding) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + var buf = Buffer(size) + if (fill !== undefined) { + if (typeof encoding === 'string') { + buf.fill(fill, encoding) + } else { + buf.fill(fill) } + } else { + buf.fill(0) + } + return buf +} - return res; - }; +SafeBuffer.allocUnsafe = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return Buffer(size) +} - if (Math.clz32) { - BN.prototype._countBits = function _countBits (w) { - return 32 - Math.clz32(w); - }; - } else { - BN.prototype._countBits = function _countBits (w) { - var t = w; - var r = 0; - if (t >= 0x1000) { - r += 13; - t >>>= 13; - } - if (t >= 0x40) { - r += 7; - t >>>= 7; - } - if (t >= 0x8) { - r += 4; - t >>>= 4; - } - if (t >= 0x02) { - r += 2; - t >>>= 2; - } - return r + t; - }; +SafeBuffer.allocUnsafeSlow = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') } + return buffer.SlowBuffer(size) +} - BN.prototype._zeroBits = function _zeroBits (w) { - // Short-cut - if (w === 0) return 26; +},{"buffer":"dskh"}],"Q14w":[function(require,module,exports) { +var Buffer = require("buffer").Buffer; +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. - var t = w; - var r = 0; - if ((t & 0x1fff) === 0) { - r += 13; - t >>>= 13; - } - if ((t & 0x7f) === 0) { - r += 7; - t >>>= 7; - } - if ((t & 0xf) === 0) { - r += 4; - t >>>= 4; - } - if ((t & 0x3) === 0) { - r += 2; - t >>>= 2; - } - if ((t & 0x1) === 0) { - r++; - } - return r; - }; +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. - // Return number of used bits in a BN - BN.prototype.bitLength = function bitLength () { - var w = this.words[this.length - 1]; - var hi = this._countBits(w); - return (this.length - 1) * 26 + hi; - }; +function isArray(arg) { + if (Array.isArray) { + return Array.isArray(arg); + } + return objectToString(arg) === '[object Array]'; +} +exports.isArray = isArray; - function toBitArray (num) { - var w = new Array(num.bitLength()); +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; - for (var bit = 0; bit < w.length; bit++) { - var off = (bit / 26) | 0; - var wbit = bit % 26; +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; - w[bit] = (num.words[off] & (1 << wbit)) >>> wbit; - } +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; - return w; - } +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; - // Number of trailing zero bits - BN.prototype.zeroBits = function zeroBits () { - if (this.isZero()) return 0; +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; - var r = 0; - for (var i = 0; i < this.length; i++) { - var b = this._zeroBits(this.words[i]); - r += b; - if (b !== 26) break; - } - return r; - }; +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; - BN.prototype.byteLength = function byteLength () { - return Math.ceil(this.bitLength() / 8); - }; +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; - BN.prototype.toTwos = function toTwos (width) { - if (this.negative !== 0) { - return this.abs().inotn(width).iaddn(1); - } - return this.clone(); - }; +function isRegExp(re) { + return objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; - BN.prototype.fromTwos = function fromTwos (width) { - if (this.testn(width - 1)) { - return this.notn(width).iaddn(1).ineg(); - } - return this.clone(); - }; +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; - BN.prototype.isNeg = function isNeg () { - return this.negative !== 0; - }; +function isDate(d) { + return objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; - // Return negative clone of `this` - BN.prototype.neg = function neg () { - return this.clone().ineg(); - }; +function isError(e) { + return (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; - BN.prototype.ineg = function ineg () { - if (!this.isZero()) { - this.negative ^= 1; - } +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; - return this; - }; +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; - // Or `num` with `this` in-place - BN.prototype.iuor = function iuor (num) { - while (this.length < num.length) { - this.words[this.length++] = 0; - } +exports.isBuffer = Buffer.isBuffer; - for (var i = 0; i < num.length; i++) { - this.words[i] = this.words[i] | num.words[i]; - } +function objectToString(o) { + return Object.prototype.toString.call(o); +} - return this.strip(); - }; +},{"buffer":"dskh"}],"rDCW":[function(require,module,exports) { - BN.prototype.ior = function ior (num) { - assert((this.negative | num.negative) === 0); - return this.iuor(num); - }; +},{}],"Um5I":[function(require,module,exports) { - // Or `num` with `this` - BN.prototype.or = function or (num) { - if (this.length > num.length) return this.clone().ior(num); - return num.clone().ior(this); - }; +'use strict'; - BN.prototype.uor = function uor (num) { - if (this.length > num.length) return this.clone().iuor(num); - return num.clone().iuor(this); - }; +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - // And `num` with `this` in-place - BN.prototype.iuand = function iuand (num) { - // b = min-length(num, this) - var b; - if (this.length > num.length) { - b = num; - } else { - b = this; - } +var Buffer = require('safe-buffer').Buffer; +var util = require('util'); - for (var i = 0; i < b.length; i++) { - this.words[i] = this.words[i] & num.words[i]; - } +function copyBuffer(src, target, offset) { + src.copy(target, offset); +} - this.length = b.length; +module.exports = function () { + function BufferList() { + _classCallCheck(this, BufferList); - return this.strip(); - }; + this.head = null; + this.tail = null; + this.length = 0; + } - BN.prototype.iand = function iand (num) { - assert((this.negative | num.negative) === 0); - return this.iuand(num); + BufferList.prototype.push = function push(v) { + var entry = { data: v, next: null }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; }; - // And `num` with `this` - BN.prototype.and = function and (num) { - if (this.length > num.length) return this.clone().iand(num); - return num.clone().iand(this); + BufferList.prototype.unshift = function unshift(v) { + var entry = { data: v, next: this.head }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; }; - BN.prototype.uand = function uand (num) { - if (this.length > num.length) return this.clone().iuand(num); - return num.clone().iuand(this); + BufferList.prototype.shift = function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; }; - // Xor `num` with `this` in-place - BN.prototype.iuxor = function iuxor (num) { - // a.length > b.length - var a; - var b; - if (this.length > num.length) { - a = this; - b = num; - } else { - a = num; - b = this; - } - - for (var i = 0; i < b.length; i++) { - this.words[i] = a.words[i] ^ b.words[i]; - } - - if (this !== a) { - for (; i < a.length; i++) { - this.words[i] = a.words[i]; - } - } - - this.length = a.length; - - return this.strip(); + BufferList.prototype.clear = function clear() { + this.head = this.tail = null; + this.length = 0; }; - BN.prototype.ixor = function ixor (num) { - assert((this.negative | num.negative) === 0); - return this.iuxor(num); + BufferList.prototype.join = function join(s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + while (p = p.next) { + ret += s + p.data; + }return ret; }; - // Xor `num` with `this` - BN.prototype.xor = function xor (num) { - if (this.length > num.length) return this.clone().ixor(num); - return num.clone().ixor(this); + BufferList.prototype.concat = function concat(n) { + if (this.length === 0) return Buffer.alloc(0); + if (this.length === 1) return this.head.data; + var ret = Buffer.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + return ret; }; - BN.prototype.uxor = function uxor (num) { - if (this.length > num.length) return this.clone().iuxor(num); - return num.clone().iuxor(this); - }; + return BufferList; +}(); - // Not ``this`` with ``width`` bitwidth - BN.prototype.inotn = function inotn (width) { - assert(typeof width === 'number' && width >= 0); +if (util && util.inspect && util.inspect.custom) { + module.exports.prototype[util.inspect.custom] = function () { + var obj = util.inspect({ length: this.length }); + return this.constructor.name + ' ' + obj; + }; +} +},{"safe-buffer":"l6K0","util":"rDCW"}],"avqi":[function(require,module,exports) { +'use strict'; - var bytesNeeded = Math.ceil(width / 26) | 0; - var bitsLeft = width % 26; +/**/ - // Extend the buffer with leading zeroes - this._expand(bytesNeeded); +var pna = require('process-nextick-args'); +/**/ - if (bitsLeft > 0) { - bytesNeeded--; - } +// undocumented cb() API, needed for core, not for public API +function destroy(err, cb) { + var _this = this; - // Handle complete words - for (var i = 0; i < bytesNeeded; i++) { - this.words[i] = ~this.words[i] & 0x3ffffff; - } + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; - // Handle the residue - if (bitsLeft > 0) { - this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft)); + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if (err && (!this._writableState || !this._writableState.errorEmitted)) { + pna.nextTick(emitErrorNT, this, err); } + return this; + } - // And remove leading zeroes - return this.strip(); - }; + // we set destroyed to true before firing error callbacks in order + // to make it re-entrance safe in case destroy() is called within callbacks - BN.prototype.notn = function notn (width) { - return this.clone().inotn(width); - }; + if (this._readableState) { + this._readableState.destroyed = true; + } - // Set `bit` of `this` - BN.prototype.setn = function setn (bit, val) { - assert(typeof bit === 'number' && bit >= 0); + // if this is a duplex stream mark the writable part as destroyed as well + if (this._writableState) { + this._writableState.destroyed = true; + } - var off = (bit / 26) | 0; - var wbit = bit % 26; + this._destroy(err || null, function (err) { + if (!cb && err) { + pna.nextTick(emitErrorNT, _this, err); + if (_this._writableState) { + _this._writableState.errorEmitted = true; + } + } else if (cb) { + cb(err); + } + }); - this._expand(off + 1); + return this; +} - if (val) { - this.words[off] = this.words[off] | (1 << wbit); - } else { - this.words[off] = this.words[off] & ~(1 << wbit); - } +function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } - return this.strip(); - }; + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } +} - // Add `num` to `this` in-place - BN.prototype.iadd = function iadd (num) { - var r; +function emitErrorNT(self, err) { + self.emit('error', err); +} - // negative + positive - if (this.negative !== 0 && num.negative === 0) { - this.negative = 0; - r = this.isub(num); - this.negative ^= 1; - return this._normSign(); +module.exports = { + destroy: destroy, + undestroy: undestroy +}; +},{"process-nextick-args":"Yj0v"}],"yM1o":[function(require,module,exports) { +var global = arguments[3]; - // positive + negative - } else if (this.negative === 0 && num.negative !== 0) { - num.negative = 0; - r = this.isub(num); - num.negative = 1; - return r._normSign(); - } +/** + * Module exports. + */ - // a.length > b.length - var a, b; - if (this.length > num.length) { - a = this; - b = num; - } else { - a = num; - b = this; - } +module.exports = deprecate; - var carry = 0; - for (var i = 0; i < b.length; i++) { - r = (a.words[i] | 0) + (b.words[i] | 0) + carry; - this.words[i] = r & 0x3ffffff; - carry = r >>> 26; - } - for (; carry !== 0 && i < a.length; i++) { - r = (a.words[i] | 0) + carry; - this.words[i] = r & 0x3ffffff; - carry = r >>> 26; - } +/** + * Mark that a method should not be used. + * Returns a modified function which warns once by default. + * + * If `localStorage.noDeprecation = true` is set, then it is a no-op. + * + * If `localStorage.throwDeprecation = true` is set, then deprecated functions + * will throw an Error when invoked. + * + * If `localStorage.traceDeprecation = true` is set, then deprecated functions + * will invoke `console.trace()` instead of `console.error()`. + * + * @param {Function} fn - the function to deprecate + * @param {String} msg - the string to print to the console when `fn` is invoked + * @returns {Function} a new "deprecated" version of `fn` + * @api public + */ - this.length = a.length; - if (carry !== 0) { - this.words[this.length] = carry; - this.length++; - // Copy the rest of the words - } else if (a !== this) { - for (; i < a.length; i++) { - this.words[i] = a.words[i]; +function deprecate (fn, msg) { + if (config('noDeprecation')) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (config('throwDeprecation')) { + throw new Error(msg); + } else if (config('traceDeprecation')) { + console.trace(msg); + } else { + console.warn(msg); } + warned = true; } + return fn.apply(this, arguments); + } - return this; - }; + return deprecated; +} - // Add `num` to `this` - BN.prototype.add = function add (num) { - var res; - if (num.negative !== 0 && this.negative === 0) { - num.negative = 0; - res = this.sub(num); - num.negative ^= 1; - return res; - } else if (num.negative === 0 && this.negative !== 0) { - this.negative = 0; - res = num.sub(this); - this.negative = 1; - return res; - } +/** + * Checks `localStorage` for boolean values for the given `name`. + * + * @param {String} name + * @returns {Boolean} + * @api private + */ - if (this.length > num.length) return this.clone().iadd(num); +function config (name) { + // accessing global.localStorage can trigger a DOMException in sandboxed iframes + try { + if (!global.localStorage) return false; + } catch (_) { + return false; + } + var val = global.localStorage[name]; + if (null == val) return false; + return String(val).toLowerCase() === 'true'; +} - return num.clone().iadd(this); +},{}],"I0x5":[function(require,module,exports) { +var process = require("process"); + +var global = arguments[3]; +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. +// A bit simpler than readable streams. +// Implement an async ._write(chunk, encoding, cb), and it'll handle all +// the drain event emission and buffering. +'use strict'; +/**/ + +var pna = require('process-nextick-args'); +/**/ + + +module.exports = Writable; +/* */ + +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} // It seems a linked list but it is not +// there will be only 2 of these for each stream + + +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + + this.finish = function () { + onCorkedFinish(_this, state); }; +} +/* */ - // Subtract `num` from `this` in-place - BN.prototype.isub = function isub (num) { - // this - (-num) = this + num - if (num.negative !== 0) { - num.negative = 0; - var r = this.iadd(num); - num.negative = 1; - return r._normSign(); +/**/ - // -this - num = -(this + num) - } else if (this.negative !== 0) { - this.negative = 0; - this.iadd(num); - this.negative = 1; - return this._normSign(); - } - // At this point both numbers are positive - var cmp = this.cmp(num); +var asyncWrite = !true && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick; +/**/ - // Optimization - zeroify - if (cmp === 0) { - this.negative = 0; - this.length = 1; - this.words[0] = 0; - return this; - } +/**/ - // a > b - var a, b; - if (cmp > 0) { - a = this; - b = num; - } else { - a = num; - b = this; - } +var Duplex; +/**/ - var carry = 0; - for (var i = 0; i < b.length; i++) { - r = (a.words[i] | 0) - (b.words[i] | 0) + carry; - carry = r >> 26; - this.words[i] = r & 0x3ffffff; - } - for (; carry !== 0 && i < a.length; i++) { - r = (a.words[i] | 0) + carry; - carry = r >> 26; - this.words[i] = r & 0x3ffffff; - } +Writable.WritableState = WritableState; +/**/ - // Copy rest of the words - if (carry === 0 && i < a.length && a !== this) { - for (; i < a.length; i++) { - this.words[i] = a.words[i]; - } - } +var util = require('core-util-is'); - this.length = Math.max(this.length, i); +util.inherits = require('inherits'); +/**/ - if (a !== this) { - this.negative = 1; - } +/**/ - return this.strip(); - }; +var internalUtil = { + deprecate: require('util-deprecate') +}; +/**/ - // Subtract `num` from `this` - BN.prototype.sub = function sub (num) { - return this.clone().isub(num); - }; +/**/ - function smallMulTo (self, num, out) { - out.negative = num.negative ^ self.negative; - var len = (self.length + num.length) | 0; - out.length = len; - len = (len - 1) | 0; +var Stream = require('./internal/streams/stream'); +/**/ - // Peel one iteration (compiler can't do it, because of code complexity) - var a = self.words[0] | 0; - var b = num.words[0] | 0; - var r = a * b; +/**/ - var lo = r & 0x3ffffff; - var carry = (r / 0x4000000) | 0; - out.words[0] = lo; - for (var k = 1; k < len; k++) { - // Sum all words with the same `i + j = k` and accumulate `ncarry`, - // note that ncarry could be >= 0x3ffffff - var ncarry = carry >>> 26; - var rword = carry & 0x3ffffff; - var maxJ = Math.min(k, num.length - 1); - for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) { - var i = (k - j) | 0; - a = self.words[i] | 0; - b = num.words[j] | 0; - r = a * b + rword; - ncarry += (r / 0x4000000) | 0; - rword = r & 0x3ffffff; - } - out.words[k] = rword | 0; - carry = ncarry | 0; - } - if (carry !== 0) { - out.words[k] = carry | 0; - } else { - out.length--; - } +var Buffer = require('safe-buffer').Buffer; - return out.strip(); +var OurUint8Array = global.Uint8Array || function () {}; + +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} + +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} +/**/ + + +var destroyImpl = require('./internal/streams/destroy'); + +util.inherits(Writable, Stream); + +function nop() {} + +function WritableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + options = options || {}; // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + + var isDuplex = stream instanceof Duplex; // object stream flag to indicate whether or not this stream + // contains buffers or objects. + + this.objectMode = !!options.objectMode; + if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + + var hwm = options.highWaterMark; + var writableHwm = options.writableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm; // cast to ints. + + this.highWaterMark = Math.floor(this.highWaterMark); // if _final has been called + + this.finalCalled = false; // drain event flag. + + this.needDrain = false; // at the start of calling end() + + this.ending = false; // when end() has been called, and returned + + this.ended = false; // when 'finish' is emitted + + this.finished = false; // has it been destroyed + + this.destroyed = false; // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + + this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + + this.length = 0; // a flag to see when we're in the middle of a write. + + this.writing = false; // when true all writes will be buffered until .uncork() call + + this.corked = 0; // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + + this.sync = true; // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + + this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb) + + this.onwrite = function (er) { + onwrite(stream, er); + }; // the callback that the user supplies to write(chunk,encoding,cb) + + + this.writecb = null; // the amount that is being written when _write is called. + + this.writelen = 0; + this.bufferedRequest = null; + this.lastBufferedRequest = null; // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + + this.pendingcb = 0; // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + + this.prefinished = false; // True if the error was already emitted and should not be thrown again + + this.errorEmitted = false; // count buffered requests + + this.bufferedRequestCount = 0; // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + + this.corkedRequestsFree = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function getBuffer() { + var current = this.bufferedRequest; + var out = []; + + while (current) { + out.push(current); + current = current.next; } - // TODO(indutny): it may be reasonable to omit it for users who don't need - // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit - // multiplication (like elliptic secp256k1). - var comb10MulTo = function comb10MulTo (self, num, out) { - var a = self.words; - var b = num.words; - var o = out.words; - var c = 0; - var lo; - var mid; - var hi; - var a0 = a[0] | 0; - var al0 = a0 & 0x1fff; - var ah0 = a0 >>> 13; - var a1 = a[1] | 0; - var al1 = a1 & 0x1fff; - var ah1 = a1 >>> 13; - var a2 = a[2] | 0; - var al2 = a2 & 0x1fff; - var ah2 = a2 >>> 13; - var a3 = a[3] | 0; - var al3 = a3 & 0x1fff; - var ah3 = a3 >>> 13; - var a4 = a[4] | 0; - var al4 = a4 & 0x1fff; - var ah4 = a4 >>> 13; - var a5 = a[5] | 0; - var al5 = a5 & 0x1fff; - var ah5 = a5 >>> 13; - var a6 = a[6] | 0; - var al6 = a6 & 0x1fff; - var ah6 = a6 >>> 13; - var a7 = a[7] | 0; - var al7 = a7 & 0x1fff; - var ah7 = a7 >>> 13; - var a8 = a[8] | 0; - var al8 = a8 & 0x1fff; - var ah8 = a8 >>> 13; - var a9 = a[9] | 0; - var al9 = a9 & 0x1fff; - var ah9 = a9 >>> 13; - var b0 = b[0] | 0; - var bl0 = b0 & 0x1fff; - var bh0 = b0 >>> 13; - var b1 = b[1] | 0; - var bl1 = b1 & 0x1fff; - var bh1 = b1 >>> 13; - var b2 = b[2] | 0; - var bl2 = b2 & 0x1fff; - var bh2 = b2 >>> 13; - var b3 = b[3] | 0; - var bl3 = b3 & 0x1fff; - var bh3 = b3 >>> 13; - var b4 = b[4] | 0; - var bl4 = b4 & 0x1fff; - var bh4 = b4 >>> 13; - var b5 = b[5] | 0; - var bl5 = b5 & 0x1fff; - var bh5 = b5 >>> 13; - var b6 = b[6] | 0; - var bl6 = b6 & 0x1fff; - var bh6 = b6 >>> 13; - var b7 = b[7] | 0; - var bl7 = b7 & 0x1fff; - var bh7 = b7 >>> 13; - var b8 = b[8] | 0; - var bl8 = b8 & 0x1fff; - var bh8 = b8 >>> 13; - var b9 = b[9] | 0; - var bl9 = b9 & 0x1fff; - var bh9 = b9 >>> 13; + return out; +}; - out.negative = self.negative ^ num.negative; - out.length = 19; - /* k = 0 */ - lo = Math.imul(al0, bl0); - mid = Math.imul(al0, bh0); - mid = (mid + Math.imul(ah0, bl0)) | 0; - hi = Math.imul(ah0, bh0); - var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; - c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0; - w0 &= 0x3ffffff; - /* k = 1 */ - lo = Math.imul(al1, bl0); - mid = Math.imul(al1, bh0); - mid = (mid + Math.imul(ah1, bl0)) | 0; - hi = Math.imul(ah1, bh0); - lo = (lo + Math.imul(al0, bl1)) | 0; - mid = (mid + Math.imul(al0, bh1)) | 0; - mid = (mid + Math.imul(ah0, bl1)) | 0; - hi = (hi + Math.imul(ah0, bh1)) | 0; - var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; - c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0; - w1 &= 0x3ffffff; - /* k = 2 */ - lo = Math.imul(al2, bl0); - mid = Math.imul(al2, bh0); - mid = (mid + Math.imul(ah2, bl0)) | 0; - hi = Math.imul(ah2, bh0); - lo = (lo + Math.imul(al1, bl1)) | 0; - mid = (mid + Math.imul(al1, bh1)) | 0; - mid = (mid + Math.imul(ah1, bl1)) | 0; - hi = (hi + Math.imul(ah1, bh1)) | 0; - lo = (lo + Math.imul(al0, bl2)) | 0; - mid = (mid + Math.imul(al0, bh2)) | 0; - mid = (mid + Math.imul(ah0, bl2)) | 0; - hi = (hi + Math.imul(ah0, bh2)) | 0; - var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; - c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0; - w2 &= 0x3ffffff; - /* k = 3 */ - lo = Math.imul(al3, bl0); - mid = Math.imul(al3, bh0); - mid = (mid + Math.imul(ah3, bl0)) | 0; - hi = Math.imul(ah3, bh0); - lo = (lo + Math.imul(al2, bl1)) | 0; - mid = (mid + Math.imul(al2, bh1)) | 0; - mid = (mid + Math.imul(ah2, bl1)) | 0; - hi = (hi + Math.imul(ah2, bh1)) | 0; - lo = (lo + Math.imul(al1, bl2)) | 0; - mid = (mid + Math.imul(al1, bh2)) | 0; - mid = (mid + Math.imul(ah1, bl2)) | 0; - hi = (hi + Math.imul(ah1, bh2)) | 0; - lo = (lo + Math.imul(al0, bl3)) | 0; - mid = (mid + Math.imul(al0, bh3)) | 0; - mid = (mid + Math.imul(ah0, bl3)) | 0; - hi = (hi + Math.imul(ah0, bh3)) | 0; - var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; - c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0; - w3 &= 0x3ffffff; - /* k = 4 */ - lo = Math.imul(al4, bl0); - mid = Math.imul(al4, bh0); - mid = (mid + Math.imul(ah4, bl0)) | 0; - hi = Math.imul(ah4, bh0); - lo = (lo + Math.imul(al3, bl1)) | 0; - mid = (mid + Math.imul(al3, bh1)) | 0; - mid = (mid + Math.imul(ah3, bl1)) | 0; - hi = (hi + Math.imul(ah3, bh1)) | 0; - lo = (lo + Math.imul(al2, bl2)) | 0; - mid = (mid + Math.imul(al2, bh2)) | 0; - mid = (mid + Math.imul(ah2, bl2)) | 0; - hi = (hi + Math.imul(ah2, bh2)) | 0; - lo = (lo + Math.imul(al1, bl3)) | 0; - mid = (mid + Math.imul(al1, bh3)) | 0; - mid = (mid + Math.imul(ah1, bl3)) | 0; - hi = (hi + Math.imul(ah1, bh3)) | 0; - lo = (lo + Math.imul(al0, bl4)) | 0; - mid = (mid + Math.imul(al0, bh4)) | 0; - mid = (mid + Math.imul(ah0, bl4)) | 0; - hi = (hi + Math.imul(ah0, bh4)) | 0; - var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; - c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0; - w4 &= 0x3ffffff; - /* k = 5 */ - lo = Math.imul(al5, bl0); - mid = Math.imul(al5, bh0); - mid = (mid + Math.imul(ah5, bl0)) | 0; - hi = Math.imul(ah5, bh0); - lo = (lo + Math.imul(al4, bl1)) | 0; - mid = (mid + Math.imul(al4, bh1)) | 0; - mid = (mid + Math.imul(ah4, bl1)) | 0; - hi = (hi + Math.imul(ah4, bh1)) | 0; - lo = (lo + Math.imul(al3, bl2)) | 0; - mid = (mid + Math.imul(al3, bh2)) | 0; - mid = (mid + Math.imul(ah3, bl2)) | 0; - hi = (hi + Math.imul(ah3, bh2)) | 0; - lo = (lo + Math.imul(al2, bl3)) | 0; - mid = (mid + Math.imul(al2, bh3)) | 0; - mid = (mid + Math.imul(ah2, bl3)) | 0; - hi = (hi + Math.imul(ah2, bh3)) | 0; - lo = (lo + Math.imul(al1, bl4)) | 0; - mid = (mid + Math.imul(al1, bh4)) | 0; - mid = (mid + Math.imul(ah1, bl4)) | 0; - hi = (hi + Math.imul(ah1, bh4)) | 0; - lo = (lo + Math.imul(al0, bl5)) | 0; - mid = (mid + Math.imul(al0, bh5)) | 0; - mid = (mid + Math.imul(ah0, bl5)) | 0; - hi = (hi + Math.imul(ah0, bh5)) | 0; - var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; - c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0; - w5 &= 0x3ffffff; - /* k = 6 */ - lo = Math.imul(al6, bl0); - mid = Math.imul(al6, bh0); - mid = (mid + Math.imul(ah6, bl0)) | 0; - hi = Math.imul(ah6, bh0); - lo = (lo + Math.imul(al5, bl1)) | 0; - mid = (mid + Math.imul(al5, bh1)) | 0; - mid = (mid + Math.imul(ah5, bl1)) | 0; - hi = (hi + Math.imul(ah5, bh1)) | 0; - lo = (lo + Math.imul(al4, bl2)) | 0; - mid = (mid + Math.imul(al4, bh2)) | 0; - mid = (mid + Math.imul(ah4, bl2)) | 0; - hi = (hi + Math.imul(ah4, bh2)) | 0; - lo = (lo + Math.imul(al3, bl3)) | 0; - mid = (mid + Math.imul(al3, bh3)) | 0; - mid = (mid + Math.imul(ah3, bl3)) | 0; - hi = (hi + Math.imul(ah3, bh3)) | 0; - lo = (lo + Math.imul(al2, bl4)) | 0; - mid = (mid + Math.imul(al2, bh4)) | 0; - mid = (mid + Math.imul(ah2, bl4)) | 0; - hi = (hi + Math.imul(ah2, bh4)) | 0; - lo = (lo + Math.imul(al1, bl5)) | 0; - mid = (mid + Math.imul(al1, bh5)) | 0; - mid = (mid + Math.imul(ah1, bl5)) | 0; - hi = (hi + Math.imul(ah1, bh5)) | 0; - lo = (lo + Math.imul(al0, bl6)) | 0; - mid = (mid + Math.imul(al0, bh6)) | 0; - mid = (mid + Math.imul(ah0, bl6)) | 0; - hi = (hi + Math.imul(ah0, bh6)) | 0; - var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; - c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0; - w6 &= 0x3ffffff; - /* k = 7 */ - lo = Math.imul(al7, bl0); - mid = Math.imul(al7, bh0); - mid = (mid + Math.imul(ah7, bl0)) | 0; - hi = Math.imul(ah7, bh0); - lo = (lo + Math.imul(al6, bl1)) | 0; - mid = (mid + Math.imul(al6, bh1)) | 0; - mid = (mid + Math.imul(ah6, bl1)) | 0; - hi = (hi + Math.imul(ah6, bh1)) | 0; - lo = (lo + Math.imul(al5, bl2)) | 0; - mid = (mid + Math.imul(al5, bh2)) | 0; - mid = (mid + Math.imul(ah5, bl2)) | 0; - hi = (hi + Math.imul(ah5, bh2)) | 0; - lo = (lo + Math.imul(al4, bl3)) | 0; - mid = (mid + Math.imul(al4, bh3)) | 0; - mid = (mid + Math.imul(ah4, bl3)) | 0; - hi = (hi + Math.imul(ah4, bh3)) | 0; - lo = (lo + Math.imul(al3, bl4)) | 0; - mid = (mid + Math.imul(al3, bh4)) | 0; - mid = (mid + Math.imul(ah3, bl4)) | 0; - hi = (hi + Math.imul(ah3, bh4)) | 0; - lo = (lo + Math.imul(al2, bl5)) | 0; - mid = (mid + Math.imul(al2, bh5)) | 0; - mid = (mid + Math.imul(ah2, bl5)) | 0; - hi = (hi + Math.imul(ah2, bh5)) | 0; - lo = (lo + Math.imul(al1, bl6)) | 0; - mid = (mid + Math.imul(al1, bh6)) | 0; - mid = (mid + Math.imul(ah1, bl6)) | 0; - hi = (hi + Math.imul(ah1, bh6)) | 0; - lo = (lo + Math.imul(al0, bl7)) | 0; - mid = (mid + Math.imul(al0, bh7)) | 0; - mid = (mid + Math.imul(ah0, bl7)) | 0; - hi = (hi + Math.imul(ah0, bh7)) | 0; - var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; - c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0; - w7 &= 0x3ffffff; - /* k = 8 */ - lo = Math.imul(al8, bl0); - mid = Math.imul(al8, bh0); - mid = (mid + Math.imul(ah8, bl0)) | 0; - hi = Math.imul(ah8, bh0); - lo = (lo + Math.imul(al7, bl1)) | 0; - mid = (mid + Math.imul(al7, bh1)) | 0; - mid = (mid + Math.imul(ah7, bl1)) | 0; - hi = (hi + Math.imul(ah7, bh1)) | 0; - lo = (lo + Math.imul(al6, bl2)) | 0; - mid = (mid + Math.imul(al6, bh2)) | 0; - mid = (mid + Math.imul(ah6, bl2)) | 0; - hi = (hi + Math.imul(ah6, bh2)) | 0; - lo = (lo + Math.imul(al5, bl3)) | 0; - mid = (mid + Math.imul(al5, bh3)) | 0; - mid = (mid + Math.imul(ah5, bl3)) | 0; - hi = (hi + Math.imul(ah5, bh3)) | 0; - lo = (lo + Math.imul(al4, bl4)) | 0; - mid = (mid + Math.imul(al4, bh4)) | 0; - mid = (mid + Math.imul(ah4, bl4)) | 0; - hi = (hi + Math.imul(ah4, bh4)) | 0; - lo = (lo + Math.imul(al3, bl5)) | 0; - mid = (mid + Math.imul(al3, bh5)) | 0; - mid = (mid + Math.imul(ah3, bl5)) | 0; - hi = (hi + Math.imul(ah3, bh5)) | 0; - lo = (lo + Math.imul(al2, bl6)) | 0; - mid = (mid + Math.imul(al2, bh6)) | 0; - mid = (mid + Math.imul(ah2, bl6)) | 0; - hi = (hi + Math.imul(ah2, bh6)) | 0; - lo = (lo + Math.imul(al1, bl7)) | 0; - mid = (mid + Math.imul(al1, bh7)) | 0; - mid = (mid + Math.imul(ah1, bl7)) | 0; - hi = (hi + Math.imul(ah1, bh7)) | 0; - lo = (lo + Math.imul(al0, bl8)) | 0; - mid = (mid + Math.imul(al0, bh8)) | 0; - mid = (mid + Math.imul(ah0, bl8)) | 0; - hi = (hi + Math.imul(ah0, bh8)) | 0; - var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; - c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0; - w8 &= 0x3ffffff; - /* k = 9 */ - lo = Math.imul(al9, bl0); - mid = Math.imul(al9, bh0); - mid = (mid + Math.imul(ah9, bl0)) | 0; - hi = Math.imul(ah9, bh0); - lo = (lo + Math.imul(al8, bl1)) | 0; - mid = (mid + Math.imul(al8, bh1)) | 0; - mid = (mid + Math.imul(ah8, bl1)) | 0; - hi = (hi + Math.imul(ah8, bh1)) | 0; - lo = (lo + Math.imul(al7, bl2)) | 0; - mid = (mid + Math.imul(al7, bh2)) | 0; - mid = (mid + Math.imul(ah7, bl2)) | 0; - hi = (hi + Math.imul(ah7, bh2)) | 0; - lo = (lo + Math.imul(al6, bl3)) | 0; - mid = (mid + Math.imul(al6, bh3)) | 0; - mid = (mid + Math.imul(ah6, bl3)) | 0; - hi = (hi + Math.imul(ah6, bh3)) | 0; - lo = (lo + Math.imul(al5, bl4)) | 0; - mid = (mid + Math.imul(al5, bh4)) | 0; - mid = (mid + Math.imul(ah5, bl4)) | 0; - hi = (hi + Math.imul(ah5, bh4)) | 0; - lo = (lo + Math.imul(al4, bl5)) | 0; - mid = (mid + Math.imul(al4, bh5)) | 0; - mid = (mid + Math.imul(ah4, bl5)) | 0; - hi = (hi + Math.imul(ah4, bh5)) | 0; - lo = (lo + Math.imul(al3, bl6)) | 0; - mid = (mid + Math.imul(al3, bh6)) | 0; - mid = (mid + Math.imul(ah3, bl6)) | 0; - hi = (hi + Math.imul(ah3, bh6)) | 0; - lo = (lo + Math.imul(al2, bl7)) | 0; - mid = (mid + Math.imul(al2, bh7)) | 0; - mid = (mid + Math.imul(ah2, bl7)) | 0; - hi = (hi + Math.imul(ah2, bh7)) | 0; - lo = (lo + Math.imul(al1, bl8)) | 0; - mid = (mid + Math.imul(al1, bh8)) | 0; - mid = (mid + Math.imul(ah1, bl8)) | 0; - hi = (hi + Math.imul(ah1, bh8)) | 0; - lo = (lo + Math.imul(al0, bl9)) | 0; - mid = (mid + Math.imul(al0, bh9)) | 0; - mid = (mid + Math.imul(ah0, bl9)) | 0; - hi = (hi + Math.imul(ah0, bh9)) | 0; - var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; - c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0; - w9 &= 0x3ffffff; - /* k = 10 */ - lo = Math.imul(al9, bl1); - mid = Math.imul(al9, bh1); - mid = (mid + Math.imul(ah9, bl1)) | 0; - hi = Math.imul(ah9, bh1); - lo = (lo + Math.imul(al8, bl2)) | 0; - mid = (mid + Math.imul(al8, bh2)) | 0; - mid = (mid + Math.imul(ah8, bl2)) | 0; - hi = (hi + Math.imul(ah8, bh2)) | 0; - lo = (lo + Math.imul(al7, bl3)) | 0; - mid = (mid + Math.imul(al7, bh3)) | 0; - mid = (mid + Math.imul(ah7, bl3)) | 0; - hi = (hi + Math.imul(ah7, bh3)) | 0; - lo = (lo + Math.imul(al6, bl4)) | 0; - mid = (mid + Math.imul(al6, bh4)) | 0; - mid = (mid + Math.imul(ah6, bl4)) | 0; - hi = (hi + Math.imul(ah6, bh4)) | 0; - lo = (lo + Math.imul(al5, bl5)) | 0; - mid = (mid + Math.imul(al5, bh5)) | 0; - mid = (mid + Math.imul(ah5, bl5)) | 0; - hi = (hi + Math.imul(ah5, bh5)) | 0; - lo = (lo + Math.imul(al4, bl6)) | 0; - mid = (mid + Math.imul(al4, bh6)) | 0; - mid = (mid + Math.imul(ah4, bl6)) | 0; - hi = (hi + Math.imul(ah4, bh6)) | 0; - lo = (lo + Math.imul(al3, bl7)) | 0; - mid = (mid + Math.imul(al3, bh7)) | 0; - mid = (mid + Math.imul(ah3, bl7)) | 0; - hi = (hi + Math.imul(ah3, bh7)) | 0; - lo = (lo + Math.imul(al2, bl8)) | 0; - mid = (mid + Math.imul(al2, bh8)) | 0; - mid = (mid + Math.imul(ah2, bl8)) | 0; - hi = (hi + Math.imul(ah2, bh8)) | 0; - lo = (lo + Math.imul(al1, bl9)) | 0; - mid = (mid + Math.imul(al1, bh9)) | 0; - mid = (mid + Math.imul(ah1, bl9)) | 0; - hi = (hi + Math.imul(ah1, bh9)) | 0; - var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; - c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0; - w10 &= 0x3ffffff; - /* k = 11 */ - lo = Math.imul(al9, bl2); - mid = Math.imul(al9, bh2); - mid = (mid + Math.imul(ah9, bl2)) | 0; - hi = Math.imul(ah9, bh2); - lo = (lo + Math.imul(al8, bl3)) | 0; - mid = (mid + Math.imul(al8, bh3)) | 0; - mid = (mid + Math.imul(ah8, bl3)) | 0; - hi = (hi + Math.imul(ah8, bh3)) | 0; - lo = (lo + Math.imul(al7, bl4)) | 0; - mid = (mid + Math.imul(al7, bh4)) | 0; - mid = (mid + Math.imul(ah7, bl4)) | 0; - hi = (hi + Math.imul(ah7, bh4)) | 0; - lo = (lo + Math.imul(al6, bl5)) | 0; - mid = (mid + Math.imul(al6, bh5)) | 0; - mid = (mid + Math.imul(ah6, bl5)) | 0; - hi = (hi + Math.imul(ah6, bh5)) | 0; - lo = (lo + Math.imul(al5, bl6)) | 0; - mid = (mid + Math.imul(al5, bh6)) | 0; - mid = (mid + Math.imul(ah5, bl6)) | 0; - hi = (hi + Math.imul(ah5, bh6)) | 0; - lo = (lo + Math.imul(al4, bl7)) | 0; - mid = (mid + Math.imul(al4, bh7)) | 0; - mid = (mid + Math.imul(ah4, bl7)) | 0; - hi = (hi + Math.imul(ah4, bh7)) | 0; - lo = (lo + Math.imul(al3, bl8)) | 0; - mid = (mid + Math.imul(al3, bh8)) | 0; - mid = (mid + Math.imul(ah3, bl8)) | 0; - hi = (hi + Math.imul(ah3, bh8)) | 0; - lo = (lo + Math.imul(al2, bl9)) | 0; - mid = (mid + Math.imul(al2, bh9)) | 0; - mid = (mid + Math.imul(ah2, bl9)) | 0; - hi = (hi + Math.imul(ah2, bh9)) | 0; - var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; - c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0; - w11 &= 0x3ffffff; - /* k = 12 */ - lo = Math.imul(al9, bl3); - mid = Math.imul(al9, bh3); - mid = (mid + Math.imul(ah9, bl3)) | 0; - hi = Math.imul(ah9, bh3); - lo = (lo + Math.imul(al8, bl4)) | 0; - mid = (mid + Math.imul(al8, bh4)) | 0; - mid = (mid + Math.imul(ah8, bl4)) | 0; - hi = (hi + Math.imul(ah8, bh4)) | 0; - lo = (lo + Math.imul(al7, bl5)) | 0; - mid = (mid + Math.imul(al7, bh5)) | 0; - mid = (mid + Math.imul(ah7, bl5)) | 0; - hi = (hi + Math.imul(ah7, bh5)) | 0; - lo = (lo + Math.imul(al6, bl6)) | 0; - mid = (mid + Math.imul(al6, bh6)) | 0; - mid = (mid + Math.imul(ah6, bl6)) | 0; - hi = (hi + Math.imul(ah6, bh6)) | 0; - lo = (lo + Math.imul(al5, bl7)) | 0; - mid = (mid + Math.imul(al5, bh7)) | 0; - mid = (mid + Math.imul(ah5, bl7)) | 0; - hi = (hi + Math.imul(ah5, bh7)) | 0; - lo = (lo + Math.imul(al4, bl8)) | 0; - mid = (mid + Math.imul(al4, bh8)) | 0; - mid = (mid + Math.imul(ah4, bl8)) | 0; - hi = (hi + Math.imul(ah4, bh8)) | 0; - lo = (lo + Math.imul(al3, bl9)) | 0; - mid = (mid + Math.imul(al3, bh9)) | 0; - mid = (mid + Math.imul(ah3, bl9)) | 0; - hi = (hi + Math.imul(ah3, bh9)) | 0; - var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; - c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0; - w12 &= 0x3ffffff; - /* k = 13 */ - lo = Math.imul(al9, bl4); - mid = Math.imul(al9, bh4); - mid = (mid + Math.imul(ah9, bl4)) | 0; - hi = Math.imul(ah9, bh4); - lo = (lo + Math.imul(al8, bl5)) | 0; - mid = (mid + Math.imul(al8, bh5)) | 0; - mid = (mid + Math.imul(ah8, bl5)) | 0; - hi = (hi + Math.imul(ah8, bh5)) | 0; - lo = (lo + Math.imul(al7, bl6)) | 0; - mid = (mid + Math.imul(al7, bh6)) | 0; - mid = (mid + Math.imul(ah7, bl6)) | 0; - hi = (hi + Math.imul(ah7, bh6)) | 0; - lo = (lo + Math.imul(al6, bl7)) | 0; - mid = (mid + Math.imul(al6, bh7)) | 0; - mid = (mid + Math.imul(ah6, bl7)) | 0; - hi = (hi + Math.imul(ah6, bh7)) | 0; - lo = (lo + Math.imul(al5, bl8)) | 0; - mid = (mid + Math.imul(al5, bh8)) | 0; - mid = (mid + Math.imul(ah5, bl8)) | 0; - hi = (hi + Math.imul(ah5, bh8)) | 0; - lo = (lo + Math.imul(al4, bl9)) | 0; - mid = (mid + Math.imul(al4, bh9)) | 0; - mid = (mid + Math.imul(ah4, bl9)) | 0; - hi = (hi + Math.imul(ah4, bh9)) | 0; - var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; - c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0; - w13 &= 0x3ffffff; - /* k = 14 */ - lo = Math.imul(al9, bl5); - mid = Math.imul(al9, bh5); - mid = (mid + Math.imul(ah9, bl5)) | 0; - hi = Math.imul(ah9, bh5); - lo = (lo + Math.imul(al8, bl6)) | 0; - mid = (mid + Math.imul(al8, bh6)) | 0; - mid = (mid + Math.imul(ah8, bl6)) | 0; - hi = (hi + Math.imul(ah8, bh6)) | 0; - lo = (lo + Math.imul(al7, bl7)) | 0; - mid = (mid + Math.imul(al7, bh7)) | 0; - mid = (mid + Math.imul(ah7, bl7)) | 0; - hi = (hi + Math.imul(ah7, bh7)) | 0; - lo = (lo + Math.imul(al6, bl8)) | 0; - mid = (mid + Math.imul(al6, bh8)) | 0; - mid = (mid + Math.imul(ah6, bl8)) | 0; - hi = (hi + Math.imul(ah6, bh8)) | 0; - lo = (lo + Math.imul(al5, bl9)) | 0; - mid = (mid + Math.imul(al5, bh9)) | 0; - mid = (mid + Math.imul(ah5, bl9)) | 0; - hi = (hi + Math.imul(ah5, bh9)) | 0; - var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; - c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0; - w14 &= 0x3ffffff; - /* k = 15 */ - lo = Math.imul(al9, bl6); - mid = Math.imul(al9, bh6); - mid = (mid + Math.imul(ah9, bl6)) | 0; - hi = Math.imul(ah9, bh6); - lo = (lo + Math.imul(al8, bl7)) | 0; - mid = (mid + Math.imul(al8, bh7)) | 0; - mid = (mid + Math.imul(ah8, bl7)) | 0; - hi = (hi + Math.imul(ah8, bh7)) | 0; - lo = (lo + Math.imul(al7, bl8)) | 0; - mid = (mid + Math.imul(al7, bh8)) | 0; - mid = (mid + Math.imul(ah7, bl8)) | 0; - hi = (hi + Math.imul(ah7, bh8)) | 0; - lo = (lo + Math.imul(al6, bl9)) | 0; - mid = (mid + Math.imul(al6, bh9)) | 0; - mid = (mid + Math.imul(ah6, bl9)) | 0; - hi = (hi + Math.imul(ah6, bh9)) | 0; - var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; - c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0; - w15 &= 0x3ffffff; - /* k = 16 */ - lo = Math.imul(al9, bl7); - mid = Math.imul(al9, bh7); - mid = (mid + Math.imul(ah9, bl7)) | 0; - hi = Math.imul(ah9, bh7); - lo = (lo + Math.imul(al8, bl8)) | 0; - mid = (mid + Math.imul(al8, bh8)) | 0; - mid = (mid + Math.imul(ah8, bl8)) | 0; - hi = (hi + Math.imul(ah8, bh8)) | 0; - lo = (lo + Math.imul(al7, bl9)) | 0; - mid = (mid + Math.imul(al7, bh9)) | 0; - mid = (mid + Math.imul(ah7, bl9)) | 0; - hi = (hi + Math.imul(ah7, bh9)) | 0; - var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; - c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0; - w16 &= 0x3ffffff; - /* k = 17 */ - lo = Math.imul(al9, bl8); - mid = Math.imul(al9, bh8); - mid = (mid + Math.imul(ah9, bl8)) | 0; - hi = Math.imul(ah9, bh8); - lo = (lo + Math.imul(al8, bl9)) | 0; - mid = (mid + Math.imul(al8, bh9)) | 0; - mid = (mid + Math.imul(ah8, bl9)) | 0; - hi = (hi + Math.imul(ah8, bh9)) | 0; - var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; - c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0; - w17 &= 0x3ffffff; - /* k = 18 */ - lo = Math.imul(al9, bl9); - mid = Math.imul(al9, bh9); - mid = (mid + Math.imul(ah9, bl9)) | 0; - hi = Math.imul(ah9, bh9); - var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; - c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0; - w18 &= 0x3ffffff; - o[0] = w0; - o[1] = w1; - o[2] = w2; - o[3] = w3; - o[4] = w4; - o[5] = w5; - o[6] = w6; - o[7] = w7; - o[8] = w8; - o[9] = w9; - o[10] = w10; - o[11] = w11; - o[12] = w12; - o[13] = w13; - o[14] = w14; - o[15] = w15; - o[16] = w16; - o[17] = w17; - o[18] = w18; - if (c !== 0) { - o[19] = c; - out.length++; +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function () { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') + }); + } catch (_) {} +})(); // Test _writableState for inheritance to account for Duplex streams, +// whose prototype chain only points to Readable. + + +var realHasInstance; + +if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function (object) { + if (realHasInstance.call(this, object)) return true; + if (this !== Writable) return false; + return object && object._writableState instanceof WritableState; } - return out; + }); +} else { + realHasInstance = function (object) { + return object instanceof this; }; +} - // Polyfill comb - if (!Math.imul) { - comb10MulTo = smallMulTo; +function Writable(options) { + Duplex = Duplex || require('./_stream_duplex'); // Writable ctor is applied to Duplexes, too. + // `realHasInstance` is necessary because using plain `instanceof` + // would return false, as no `_writableState` property is attached. + // Trying to use the custom `instanceof` for Writable here will also break the + // Node.js LazyTransform implementation, which has a non-trivial getter for + // `_writableState` that would lead to infinite recursion. + + if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) { + return new Writable(options); } - function bigMulTo (self, num, out) { - out.negative = num.negative ^ self.negative; - out.length = self.length + num.length; + this._writableState = new WritableState(options, this); // legacy. - var carry = 0; - var hncarry = 0; - for (var k = 0; k < out.length - 1; k++) { - // Sum all words with the same `i + j = k` and accumulate `ncarry`, - // note that ncarry could be >= 0x3ffffff - var ncarry = hncarry; - hncarry = 0; - var rword = carry & 0x3ffffff; - var maxJ = Math.min(k, num.length - 1); - for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) { - var i = k - j; - var a = self.words[i] | 0; - var b = num.words[j] | 0; - var r = a * b; - - var lo = r & 0x3ffffff; - ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0; - lo = (lo + rword) | 0; - rword = lo & 0x3ffffff; - ncarry = (ncarry + (lo >>> 26)) | 0; - - hncarry += ncarry >>> 26; - ncarry &= 0x3ffffff; - } - out.words[k] = rword; - carry = ncarry; - ncarry = hncarry; - } - if (carry !== 0) { - out.words[k] = carry; - } else { - out.length--; - } + this.writable = true; - return out.strip(); + if (options) { + if (typeof options.write === 'function') this._write = options.write; + if (typeof options.writev === 'function') this._writev = options.writev; + if (typeof options.destroy === 'function') this._destroy = options.destroy; + if (typeof options.final === 'function') this._final = options.final; } - function jumboMulTo (self, num, out) { - var fftm = new FFTM(); - return fftm.mulp(self, num, out); - } + Stream.call(this); +} // Otherwise people can pipe Writable streams, which is just wrong. - BN.prototype.mulTo = function mulTo (num, out) { - var res; - var len = this.length + num.length; - if (this.length === 10 && num.length === 10) { - res = comb10MulTo(this, num, out); - } else if (len < 63) { - res = smallMulTo(this, num, out); - } else if (len < 1024) { - res = bigMulTo(this, num, out); - } else { - res = jumboMulTo(this, num, out); - } - return res; - }; +Writable.prototype.pipe = function () { + this.emit('error', new Error('Cannot pipe, not readable')); +}; - // Cooley-Tukey algorithm for FFT - // slightly revisited to rely on looping instead of recursion +function writeAfterEnd(stream, cb) { + var er = new Error('write after end'); // TODO: defer error events consistently everywhere, not just the cb - function FFTM (x, y) { - this.x = x; - this.y = y; - } + stream.emit('error', er); + pna.nextTick(cb, er); +} // Checks that a user-supplied chunk is valid, especially for the particular +// mode the stream is in. Currently this means that `null` is never accepted +// and undefined/non-string values are only allowed in object mode. - FFTM.prototype.makeRBT = function makeRBT (N) { - var t = new Array(N); - var l = BN.prototype._countBits(N) - 1; - for (var i = 0; i < N; i++) { - t[i] = this.revBin(i, l, N); - } - return t; - }; +function validChunk(stream, state, chunk, cb) { + var valid = true; + var er = false; - // Returns binary-reversed representation of `x` - FFTM.prototype.revBin = function revBin (x, l, N) { - if (x === 0 || x === N - 1) return x; + if (chunk === null) { + er = new TypeError('May not write null values to stream'); + } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } - var rb = 0; - for (var i = 0; i < l; i++) { - rb |= (x & 1) << (l - i - 1); - x >>= 1; - } + if (er) { + stream.emit('error', er); + pna.nextTick(cb, er); + valid = false; + } - return rb; - }; + return valid; +} - // Performs "tweedling" phase, therefore 'emulating' - // behaviour of the recursive algorithm - FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) { - for (var i = 0; i < N; i++) { - rtws[i] = rws[rbt[i]]; - itws[i] = iws[rbt[i]]; - } - }; +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; - FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) { - this.permute(rbt, rws, iws, rtws, itws, N); + var isBuf = !state.objectMode && _isUint8Array(chunk); - for (var s = 1; s < N; s <<= 1) { - var l = s << 1; + if (isBuf && !Buffer.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } - var rtwdf = Math.cos(2 * Math.PI / l); - var itwdf = Math.sin(2 * Math.PI / l); + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } - for (var p = 0; p < N; p += l) { - var rtwdf_ = rtwdf; - var itwdf_ = itwdf; + if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + if (typeof cb !== 'function') cb = nop; + if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); + } + return ret; +}; - for (var j = 0; j < s; j++) { - var re = rtws[p + j]; - var ie = itws[p + j]; +Writable.prototype.cork = function () { + var state = this._writableState; + state.corked++; +}; - var ro = rtws[p + j + s]; - var io = itws[p + j + s]; +Writable.prototype.uncork = function () { + var state = this._writableState; - var rx = rtwdf_ * ro - itwdf_ * io; + if (state.corked) { + state.corked--; + if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } +}; - io = rtwdf_ * io + itwdf_ * ro; - ro = rx; +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + this._writableState.defaultEncoding = encoding; + return this; +}; - rtws[p + j] = re + ro; - itws[p + j] = ie + io; +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } - rtws[p + j + s] = re - ro; - itws[p + j + s] = ie - io; + return chunk; +} - /* jshint maxdepth : false */ - if (j !== l) { - rx = rtwdf * rtwdf_ - itwdf * itwdf_; +Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); // if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. - itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_; - rtwdf_ = rx; - } - } - } - } - }; +function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state, chunk, encoding); - FFTM.prototype.guessLen13b = function guessLen13b (n, m) { - var N = Math.max(m, n) | 1; - var odd = N & 1; - var i = 0; - for (N = N / 2 | 0; N; N = N >>> 1) { - i++; + if (chunk !== newChunk) { + isBuf = true; + encoding = 'buffer'; + chunk = newChunk; } + } - return 1 << i + 1 + odd; - }; + var len = state.objectMode ? 1 : chunk.length; + state.length += len; + var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false. - FFTM.prototype.conjugate = function conjugate (rws, iws, N) { - if (N <= 1) return; + if (!ret) state.needDrain = true; - for (var i = 0; i < N / 2; i++) { - var t = rws[i]; + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = { + chunk: chunk, + encoding: encoding, + isBuf: isBuf, + callback: cb, + next: null + }; - rws[i] = rws[N - i - 1]; - rws[N - i - 1] = t; + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } - t = iws[i]; + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } - iws[i] = -iws[N - i - 1]; - iws[N - i - 1] = -t; - } - }; + return ret; +} - FFTM.prototype.normalize13b = function normalize13b (ws, N) { - var carry = 0; - for (var i = 0; i < N / 2; i++) { - var w = Math.round(ws[2 * i + 1] / N) * 0x2000 + - Math.round(ws[2 * i] / N) + - carry; +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} - ws[i] = w & 0x3ffffff; +function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; - if (w < 0x4000000) { - carry = 0; - } else { - carry = w / 0x4000000 | 0; - } - } + if (sync) { + // defer the callback if we are being called synchronously + // to avoid piling up things on the stack + pna.nextTick(cb, er); // this can emit finish, and it will always happen + // after error - return ws; - }; + pna.nextTick(finishMaybe, stream, state); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + } else { + // the caller expect this to happen before if + // it is async + cb(er); + stream._writableState.errorEmitted = true; + stream.emit('error', er); // this can emit finish, but finish must + // always follow error - FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) { - var carry = 0; - for (var i = 0; i < len; i++) { - carry = carry + (ws[i] | 0); + finishMaybe(stream, state); + } +} - rws[2 * i] = carry & 0x1fff; carry = carry >>> 13; - rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13; - } +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} - // Pad with zeroes - for (i = 2 * len; i < N; ++i) { - rws[i] = 0; - } +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + onwriteStateUpdate(state); + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state); - assert(carry === 0); - assert((carry & ~0x1fff) === 0); - }; + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } - FFTM.prototype.stub = function stub (N) { - var ph = new Array(N); - for (var i = 0; i < N; i++) { - ph[i] = 0; + if (sync) { + /**/ + asyncWrite(afterWrite, stream, state, finished, cb); + /**/ + } else { + afterWrite(stream, state, finished, cb); } + } +} - return ph; - }; +function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} // Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. - FFTM.prototype.mulp = function mulp (x, y, out) { - var N = 2 * this.guessLen13b(x.length, y.length); - var rbt = this.makeRBT(N); +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} // if there's something in the buffer waiting, then process it - var _ = this.stub(N); - var rws = new Array(N); - var rwst = new Array(N); - var iwst = new Array(N); +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; - var nrws = new Array(N); - var nrwst = new Array(N); - var niwst = new Array(N); + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + var count = 0; + var allBuffers = true; - var rmws = out.words; - rmws.length = N; + while (entry) { + buffer[count] = entry; + if (!entry.isBuf) allBuffers = false; + entry = entry.next; + count += 1; + } - this.convert13b(x.words, x.length, rws, N); - this.convert13b(y.words, y.length, nrws, N); + buffer.allBuffers = allBuffers; + doWrite(stream, state, true, state.length, buffer, '', holder.finish); // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite - this.transform(rws, _, rwst, iwst, N, rbt); - this.transform(nrws, _, nrwst, niwst, N, rbt); + state.pendingcb++; + state.lastBufferedRequest = null; - for (var i = 0; i < N; i++) { - var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i]; - iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i]; - rwst[i] = rx; + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); } - this.conjugate(rwst, iwst, N); - this.transform(rwst, iwst, rmws, _, N, rbt); - this.conjugate(rmws, _, N); - this.normalize13b(rmws, N); + state.bufferedRequestCount = 0; + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + state.bufferedRequestCount--; // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. - out.negative = x.negative ^ y.negative; - out.length = x.length + y.length; - return out.strip(); - }; + if (state.writing) { + break; + } + } - // Multiply `this` by `num` - BN.prototype.mul = function mul (num) { - var out = new BN(null); - out.words = new Array(this.length + num.length); - return this.mulTo(num, out); - }; + if (entry === null) state.lastBufferedRequest = null; + } - // Multiply employing FFT - BN.prototype.mulf = function mulf (num) { - var out = new BN(null); - out.words = new Array(this.length + num.length); - return jumboMulTo(this, num, out); - }; + state.bufferedRequest = entry; + state.bufferProcessing = false; +} - // In-place Multiplication - BN.prototype.imul = function imul (num) { - return this.clone().mulTo(num, this); - }; +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new Error('_write() is not implemented')); +}; - BN.prototype.imuln = function imuln (num) { - assert(typeof num === 'number'); - assert(num < 0x4000000); +Writable.prototype._writev = null; - // Carry - var carry = 0; - for (var i = 0; i < this.length; i++) { - var w = (this.words[i] | 0) * num; - var lo = (w & 0x3ffffff) + (carry & 0x3ffffff); - carry >>= 26; - carry += (w / 0x4000000) | 0; - // NOTE: lo is 27bit maximum - carry += lo >>> 26; - this.words[i] = lo & 0x3ffffff; - } +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; - if (carry !== 0) { - this.words[i] = carry; - this.length++; - } + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } - return this; - }; + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); // .end() fully uncorks - BN.prototype.muln = function muln (num) { - return this.clone().imuln(num); - }; + if (state.corked) { + state.corked = 1; + this.uncork(); + } // ignore unnecessary end() calls. - // `this` * `this` - BN.prototype.sqr = function sqr () { - return this.mul(this); - }; - // `this` * `this` in-place - BN.prototype.isqr = function isqr () { - return this.imul(this.clone()); - }; + if (!state.ending && !state.finished) endWritable(this, state, cb); +}; - // Math.pow(`this`, `num`) - BN.prototype.pow = function pow (num) { - var w = toBitArray(num); - if (w.length === 0) return new BN(1); +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} - // Skip leading zeroes - var res = this; - for (var i = 0; i < w.length; i++, res = res.sqr()) { - if (w[i] !== 0) break; - } - - if (++i < w.length) { - for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) { - if (w[i] === 0) continue; +function callFinal(stream, state) { + stream._final(function (err) { + state.pendingcb--; - res = res.mul(q); - } + if (err) { + stream.emit('error', err); } - return res; - }; - - // Shift-left in-place - BN.prototype.iushln = function iushln (bits) { - assert(typeof bits === 'number' && bits >= 0); - var r = bits % 26; - var s = (bits - r) / 26; - var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r); - var i; - - if (r !== 0) { - var carry = 0; - - for (i = 0; i < this.length; i++) { - var newCarry = this.words[i] & carryMask; - var c = ((this.words[i] | 0) - newCarry) << r; - this.words[i] = c | carry; - carry = newCarry >>> (26 - r); - } + state.prefinished = true; + stream.emit('prefinish'); + finishMaybe(stream, state); + }); +} - if (carry) { - this.words[i] = carry; - this.length++; - } +function prefinish(stream, state) { + if (!state.prefinished && !state.finalCalled) { + if (typeof stream._final === 'function') { + state.pendingcb++; + state.finalCalled = true; + pna.nextTick(callFinal, stream, state); + } else { + state.prefinished = true; + stream.emit('prefinish'); } + } +} - if (s !== 0) { - for (i = this.length - 1; i >= 0; i--) { - this.words[i + s] = this.words[i]; - } +function finishMaybe(stream, state) { + var need = needFinish(state); - for (i = 0; i < s; i++) { - this.words[i] = 0; - } + if (need) { + prefinish(stream, state); - this.length += s; + if (state.pendingcb === 0) { + state.finished = true; + stream.emit('finish'); } + } - return this.strip(); - }; - - BN.prototype.ishln = function ishln (bits) { - // TODO(indutny): implement me - assert(this.negative === 0); - return this.iushln(bits); - }; - - // Shift-right in-place - // NOTE: `hint` is a lowest bit before trailing zeroes - // NOTE: if `extended` is present - it will be filled with destroyed bits - BN.prototype.iushrn = function iushrn (bits, hint, extended) { - assert(typeof bits === 'number' && bits >= 0); - var h; - if (hint) { - h = (hint - (hint % 26)) / 26; - } else { - h = 0; - } + return need; +} - var r = bits % 26; - var s = Math.min((bits - r) / 26, this.length); - var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r); - var maskedWords = extended; +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); - h -= s; - h = Math.max(0, h); + if (cb) { + if (state.finished) pna.nextTick(cb);else stream.once('finish', cb); + } - // Extended mode, copy masked part - if (maskedWords) { - for (var i = 0; i < s; i++) { - maskedWords.words[i] = this.words[i]; - } - maskedWords.length = s; - } + state.ended = true; + stream.writable = false; +} - if (s === 0) { - // No-op, we should not move anything at all - } else if (this.length > s) { - this.length -= s; - for (i = 0; i < this.length; i++) { - this.words[i] = this.words[i + s]; - } - } else { - this.words[0] = 0; - this.length = 1; - } +function onCorkedFinish(corkReq, state, err) { + var entry = corkReq.entry; + corkReq.entry = null; - var carry = 0; - for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) { - var word = this.words[i] | 0; - this.words[i] = (carry << (26 - r)) | (word >>> r); - carry = word & mask; - } + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } - // Push carried bits as a mask - if (maskedWords && carry !== 0) { - maskedWords.words[maskedWords.length++] = carry; - } + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = corkReq; + } else { + state.corkedRequestsFree = corkReq; + } +} - if (this.length === 0) { - this.words[0] = 0; - this.length = 1; +Object.defineProperty(Writable.prototype, 'destroyed', { + get: function () { + if (this._writableState === undefined) { + return false; } - return this.strip(); - }; - - BN.prototype.ishrn = function ishrn (bits, hint, extended) { - // TODO(indutny): implement me - assert(this.negative === 0); - return this.iushrn(bits, hint, extended); - }; + return this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._writableState) { + return; + } // backward compatibility, the user is explicitly + // managing destroyed - // Shift-left - BN.prototype.shln = function shln (bits) { - return this.clone().ishln(bits); - }; - BN.prototype.ushln = function ushln (bits) { - return this.clone().iushln(bits); - }; + this._writableState.destroyed = value; + } +}); +Writable.prototype.destroy = destroyImpl.destroy; +Writable.prototype._undestroy = destroyImpl.undestroy; - // Shift-right - BN.prototype.shrn = function shrn (bits) { - return this.clone().ishrn(bits); - }; +Writable.prototype._destroy = function (err, cb) { + this.end(); + cb(err); +}; +},{"process-nextick-args":"Yj0v","core-util-is":"Q14w","inherits":"Bm0n","util-deprecate":"yM1o","./internal/streams/stream":"Q8A6","safe-buffer":"l6K0","./internal/streams/destroy":"avqi","./_stream_duplex":"wldW","process":"pBGv"}],"wldW":[function(require,module,exports) { +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. - BN.prototype.ushrn = function ushrn (bits) { - return this.clone().iushrn(bits); - }; +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. - // Test if n bit is set - BN.prototype.testn = function testn (bit) { - assert(typeof bit === 'number' && bit >= 0); - var r = bit % 26; - var s = (bit - r) / 26; - var q = 1 << r; +'use strict'; - // Fast case: bit is much higher than all existing words - if (this.length <= s) return false; +/**/ - // Check bit and return - var w = this.words[s]; +var pna = require('process-nextick-args'); +/**/ - return !!(w & q); - }; +/**/ +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + keys.push(key); + }return keys; +}; +/**/ - // Return only lowers bits of number (in-place) - BN.prototype.imaskn = function imaskn (bits) { - assert(typeof bits === 'number' && bits >= 0); - var r = bits % 26; - var s = (bits - r) / 26; +module.exports = Duplex; - assert(this.negative === 0, 'imaskn works only with positive numbers'); +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ - if (this.length <= s) { - return this; - } +var Readable = require('./_stream_readable'); +var Writable = require('./_stream_writable'); - if (r !== 0) { - s++; - } - this.length = Math.min(s, this.length); +util.inherits(Duplex, Readable); - if (r !== 0) { - var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r); - this.words[this.length - 1] &= mask; - } +{ + // avoid scope creep, the keys array can then be collected + var keys = objectKeys(Writable.prototype); + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; + } +} - return this.strip(); - }; +function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); - // Return only lowers bits of number - BN.prototype.maskn = function maskn (bits) { - return this.clone().imaskn(bits); - }; + Readable.call(this, options); + Writable.call(this, options); - // Add plain number `num` to `this` - BN.prototype.iaddn = function iaddn (num) { - assert(typeof num === 'number'); - assert(num < 0x4000000); - if (num < 0) return this.isubn(-num); + if (options && options.readable === false) this.readable = false; - // Possible sign change - if (this.negative !== 0) { - if (this.length === 1 && (this.words[0] | 0) < num) { - this.words[0] = num - (this.words[0] | 0); - this.negative = 0; - return this; - } + if (options && options.writable === false) this.writable = false; - this.negative = 0; - this.isubn(num); - this.negative = 1; - return this; - } + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; - // Add without checks - return this._iaddn(num); - }; + this.once('end', onend); +} - BN.prototype._iaddn = function _iaddn (num) { - this.words[0] += num; +Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); - // Carry - for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) { - this.words[i] -= 0x4000000; - if (i === this.length - 1) { - this.words[i + 1] = 1; - } else { - this.words[i + 1]++; - } - } - this.length = Math.max(this.length, i + 1); +// the no-half-open enforcer +function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) return; - return this; - }; + // no more data can be written. + // But allow more writes to happen in this tick. + pna.nextTick(onEndNT, this); +} - // Subtract plain number `num` from `this` - BN.prototype.isubn = function isubn (num) { - assert(typeof num === 'number'); - assert(num < 0x4000000); - if (num < 0) return this.iaddn(-num); +function onEndNT(self) { + self.end(); +} - if (this.negative !== 0) { - this.negative = 0; - this.iaddn(num); - this.negative = 1; - return this; +Object.defineProperty(Duplex.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined || this._writableState === undefined) { + return false; } - - this.words[0] -= num; - - if (this.length === 1 && this.words[0] < 0) { - this.words[0] = -this.words[0]; - this.negative = 1; - } else { - // Carry - for (var i = 0; i < this.length && this.words[i] < 0; i++) { - this.words[i] += 0x4000000; - this.words[i + 1] -= 1; - } + return this._readableState.destroyed && this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (this._readableState === undefined || this._writableState === undefined) { + return; } - return this.strip(); - }; - - BN.prototype.addn = function addn (num) { - return this.clone().iaddn(num); - }; - - BN.prototype.subn = function subn (num) { - return this.clone().isubn(num); - }; + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } +}); - BN.prototype.iabs = function iabs () { - this.negative = 0; +Duplex.prototype._destroy = function (err, cb) { + this.push(null); + this.end(); - return this; - }; + pna.nextTick(cb, err); +}; +},{"process-nextick-args":"Yj0v","core-util-is":"Q14w","inherits":"Bm0n","./_stream_readable":"Ogwm","./_stream_writable":"I0x5"}],"F7WD":[function(require,module,exports) { - BN.prototype.abs = function abs () { - return this.clone().iabs(); - }; +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. - BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) { - var len = num.length + shift; - var i; +'use strict'; - this._expand(len); +/**/ - var w; - var carry = 0; - for (i = 0; i < num.length; i++) { - w = (this.words[i + shift] | 0) + carry; - var right = (num.words[i] | 0) * mul; - w -= right & 0x3ffffff; - carry = (w >> 26) - ((right / 0x4000000) | 0); - this.words[i + shift] = w & 0x3ffffff; - } - for (; i < this.length - shift; i++) { - w = (this.words[i + shift] | 0) + carry; - carry = w >> 26; - this.words[i + shift] = w & 0x3ffffff; - } +var Buffer = require('safe-buffer').Buffer; +/**/ - if (carry === 0) return this.strip(); +var isEncoding = Buffer.isEncoding || function (encoding) { + encoding = '' + encoding; + switch (encoding && encoding.toLowerCase()) { + case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': + return true; + default: + return false; + } +}; - // Subtraction overflow - assert(carry === -1); - carry = 0; - for (i = 0; i < this.length; i++) { - w = -(this.words[i] | 0) + carry; - carry = w >> 26; - this.words[i] = w & 0x3ffffff; +function _normalizeEncoding(enc) { + if (!enc) return 'utf8'; + var retried; + while (true) { + switch (enc) { + case 'utf8': + case 'utf-8': + return 'utf8'; + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return 'utf16le'; + case 'latin1': + case 'binary': + return 'latin1'; + case 'base64': + case 'ascii': + case 'hex': + return enc; + default: + if (retried) return; // undefined + enc = ('' + enc).toLowerCase(); + retried = true; } - this.negative = 1; - - return this.strip(); - }; - - BN.prototype._wordDiv = function _wordDiv (num, mode) { - var shift = this.length - num.length; + } +}; - var a = this.clone(); - var b = num; +// Do not cache `Buffer.isEncoding` when checking encoding names as some +// modules monkey-patch it to support additional encodings +function normalizeEncoding(enc) { + var nenc = _normalizeEncoding(enc); + if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); + return nenc || enc; +} - // Normalize - var bhi = b.words[b.length - 1] | 0; - var bhiBits = this._countBits(bhi); - shift = 26 - bhiBits; - if (shift !== 0) { - b = b.ushln(shift); - a.iushln(shift); - bhi = b.words[b.length - 1] | 0; - } +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. +exports.StringDecoder = StringDecoder; +function StringDecoder(encoding) { + this.encoding = normalizeEncoding(encoding); + var nb; + switch (this.encoding) { + case 'utf16le': + this.text = utf16Text; + this.end = utf16End; + nb = 4; + break; + case 'utf8': + this.fillLast = utf8FillLast; + nb = 4; + break; + case 'base64': + this.text = base64Text; + this.end = base64End; + nb = 3; + break; + default: + this.write = simpleWrite; + this.end = simpleEnd; + return; + } + this.lastNeed = 0; + this.lastTotal = 0; + this.lastChar = Buffer.allocUnsafe(nb); +} - // Initialize quotient - var m = a.length - b.length; - var q; +StringDecoder.prototype.write = function (buf) { + if (buf.length === 0) return ''; + var r; + var i; + if (this.lastNeed) { + r = this.fillLast(buf); + if (r === undefined) return ''; + i = this.lastNeed; + this.lastNeed = 0; + } else { + i = 0; + } + if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); + return r || ''; +}; - if (mode !== 'mod') { - q = new BN(null); - q.length = m + 1; - q.words = new Array(q.length); - for (var i = 0; i < q.length; i++) { - q.words[i] = 0; - } - } +StringDecoder.prototype.end = utf8End; - var diff = a.clone()._ishlnsubmul(b, 1, m); - if (diff.negative === 0) { - a = diff; - if (q) { - q.words[m] = 1; - } - } +// Returns only complete characters in a Buffer +StringDecoder.prototype.text = utf8Text; - for (var j = m - 1; j >= 0; j--) { - var qj = (a.words[b.length + j] | 0) * 0x4000000 + - (a.words[b.length + j - 1] | 0); +// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer +StringDecoder.prototype.fillLast = function (buf) { + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); + this.lastNeed -= buf.length; +}; - // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max - // (0x7ffffff) - qj = Math.min((qj / bhi) | 0, 0x3ffffff); +// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a +// continuation byte. If an invalid byte is detected, -2 is returned. +function utf8CheckByte(byte) { + if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; + return byte >> 6 === 0x02 ? -1 : -2; +} - a._ishlnsubmul(b, qj, j); - while (a.negative !== 0) { - qj--; - a.negative = 0; - a._ishlnsubmul(b, 1, j); - if (!a.isZero()) { - a.negative ^= 1; - } - } - if (q) { - q.words[j] = qj; - } - } - if (q) { - q.strip(); +// Checks at most 3 bytes at the end of a Buffer in order to detect an +// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) +// needed to complete the UTF-8 character (if applicable) are returned. +function utf8CheckIncomplete(self, buf, i) { + var j = buf.length - 1; + if (j < i) return 0; + var nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 1; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 2; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) { + if (nb === 2) nb = 0;else self.lastNeed = nb - 3; } - a.strip(); + return nb; + } + return 0; +} - // Denormalize - if (mode !== 'div' && shift !== 0) { - a.iushrn(shift); +// Validates as many continuation bytes for a multi-byte UTF-8 character as +// needed or are available. If we see a non-continuation byte where we expect +// one, we "replace" the validated continuation bytes we've seen so far with +// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding +// behavior. The continuation byte check is included three times in the case +// where all of the continuation bytes for a character exist in the same buffer. +// It is also done this way as a slight performance increase instead of using a +// loop. +function utf8CheckExtraBytes(self, buf, p) { + if ((buf[0] & 0xC0) !== 0x80) { + self.lastNeed = 0; + return '\ufffd'; + } + if (self.lastNeed > 1 && buf.length > 1) { + if ((buf[1] & 0xC0) !== 0x80) { + self.lastNeed = 1; + return '\ufffd'; } - - return { - div: q || null, - mod: a - }; - }; - - // NOTE: 1) `mode` can be set to `mod` to request mod only, - // to `div` to request div only, or be absent to - // request both div & mod - // 2) `positive` is true if unsigned mod is requested - BN.prototype.divmod = function divmod (num, mode, positive) { - assert(!num.isZero()); - - if (this.isZero()) { - return { - div: new BN(0), - mod: new BN(0) - }; + if (self.lastNeed > 2 && buf.length > 2) { + if ((buf[2] & 0xC0) !== 0x80) { + self.lastNeed = 2; + return '\ufffd'; + } } + } +} - var div, mod, res; - if (this.negative !== 0 && num.negative === 0) { - res = this.neg().divmod(num, mode); +// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. +function utf8FillLast(buf) { + var p = this.lastTotal - this.lastNeed; + var r = utf8CheckExtraBytes(this, buf, p); + if (r !== undefined) return r; + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, p, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, p, 0, buf.length); + this.lastNeed -= buf.length; +} - if (mode !== 'mod') { - div = res.div.neg(); - } +// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a +// partial character, the character's bytes are buffered until the required +// number of bytes are available. +function utf8Text(buf, i) { + var total = utf8CheckIncomplete(this, buf, i); + if (!this.lastNeed) return buf.toString('utf8', i); + this.lastTotal = total; + var end = buf.length - (total - this.lastNeed); + buf.copy(this.lastChar, 0, end); + return buf.toString('utf8', i, end); +} - if (mode !== 'div') { - mod = res.mod.neg(); - if (positive && mod.negative !== 0) { - mod.iadd(num); - } - } +// For UTF-8, a replacement character is added when ending on a partial +// character. +function utf8End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + '\ufffd'; + return r; +} - return { - div: div, - mod: mod - }; +// UTF-16LE typically needs two bytes per character, but even if we have an even +// number of bytes available, we need to check if we end on a leading/high +// surrogate. In that case, we need to wait for the next two bytes in order to +// decode the last character properly. +function utf16Text(buf, i) { + if ((buf.length - i) % 2 === 0) { + var r = buf.toString('utf16le', i); + if (r) { + var c = r.charCodeAt(r.length - 1); + if (c >= 0xD800 && c <= 0xDBFF) { + this.lastNeed = 2; + this.lastTotal = 4; + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + return r.slice(0, -1); + } } + return r; + } + this.lastNeed = 1; + this.lastTotal = 2; + this.lastChar[0] = buf[buf.length - 1]; + return buf.toString('utf16le', i, buf.length - 1); +} - if (this.negative === 0 && num.negative !== 0) { - res = this.divmod(num.neg(), mode); +// For UTF-16LE we do not explicitly append special replacement characters if we +// end on a partial character, we simply let v8 handle that. +function utf16End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) { + var end = this.lastTotal - this.lastNeed; + return r + this.lastChar.toString('utf16le', 0, end); + } + return r; +} - if (mode !== 'mod') { - div = res.div.neg(); - } +function base64Text(buf, i) { + var n = (buf.length - i) % 3; + if (n === 0) return buf.toString('base64', i); + this.lastNeed = 3 - n; + this.lastTotal = 3; + if (n === 1) { + this.lastChar[0] = buf[buf.length - 1]; + } else { + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + } + return buf.toString('base64', i, buf.length - n); +} - return { - div: div, - mod: res.mod - }; - } +function base64End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); + return r; +} - if ((this.negative & num.negative) !== 0) { - res = this.neg().divmod(num.neg(), mode); +// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) +function simpleWrite(buf) { + return buf.toString(this.encoding); +} - if (mode !== 'div') { - mod = res.mod.neg(); - if (positive && mod.negative !== 0) { - mod.isub(num); - } - } +function simpleEnd(buf) { + return buf && buf.length ? this.write(buf) : ''; +} +},{"safe-buffer":"l6K0"}],"Ogwm":[function(require,module,exports) { - return { - div: res.div, - mod: mod - }; - } +var global = arguments[3]; +var process = require("process"); +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. - // Both numbers are positive at this point +'use strict'; - // Strip both numbers to approximate shift value - if (num.length > this.length || this.cmp(num) < 0) { - return { - div: new BN(0), - mod: this - }; - } +/**/ - // Very short reduction - if (num.length === 1) { - if (mode === 'div') { - return { - div: this.divn(num.words[0]), - mod: null - }; - } +var pna = require('process-nextick-args'); +/**/ - if (mode === 'mod') { - return { - div: null, - mod: new BN(this.modn(num.words[0])) - }; - } +module.exports = Readable; - return { - div: this.divn(num.words[0]), - mod: new BN(this.modn(num.words[0])) - }; - } +/**/ +var isArray = require('isarray'); +/**/ - return this._wordDiv(num, mode); - }; +/**/ +var Duplex; +/**/ - // Find `this` / `num` - BN.prototype.div = function div (num) { - return this.divmod(num, 'div', false).div; - }; +Readable.ReadableState = ReadableState; - // Find `this` % `num` - BN.prototype.mod = function mod (num) { - return this.divmod(num, 'mod', false).mod; - }; +/**/ +var EE = require('events').EventEmitter; - BN.prototype.umod = function umod (num) { - return this.divmod(num, 'mod', true).mod; - }; +var EElistenerCount = function (emitter, type) { + return emitter.listeners(type).length; +}; +/**/ - // Find Round(`this` / `num`) - BN.prototype.divRound = function divRound (num) { - var dm = this.divmod(num); +/**/ +var Stream = require('./internal/streams/stream'); +/**/ - // Fast case - exact division - if (dm.mod.isZero()) return dm.div; +/**/ - var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod; +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} - var half = num.ushrn(1); - var r2 = num.andln(1); - var cmp = mod.cmp(half); +/**/ - // Round down - if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div; +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ - // Round up - return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1); - }; +/**/ +var debugUtil = require('util'); +var debug = void 0; +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function () {}; +} +/**/ - BN.prototype.modn = function modn (num) { - assert(num <= 0x3ffffff); - var p = (1 << 26) % num; +var BufferList = require('./internal/streams/BufferList'); +var destroyImpl = require('./internal/streams/destroy'); +var StringDecoder; - var acc = 0; - for (var i = this.length - 1; i >= 0; i--) { - acc = (p * acc + (this.words[i] | 0)) % num; - } +util.inherits(Readable, Stream); - return acc; - }; +var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; - // In-place division by number - BN.prototype.idivn = function idivn (num) { - assert(num <= 0x3ffffff); +function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); - var carry = 0; - for (var i = this.length - 1; i >= 0; i--) { - var w = (this.words[i] | 0) + carry * 0x4000000; - this.words[i] = (w / num) | 0; - carry = w % num; - } + // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; +} - return this.strip(); - }; +function ReadableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); - BN.prototype.divn = function divn (num) { - return this.clone().idivn(num); - }; + options = options || {}; - BN.prototype.egcd = function egcd (p) { - assert(p.negative === 0); - assert(!p.isZero()); + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; - var x = this; - var y = p.clone(); + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; - if (x.negative !== 0) { - x = x.umod(p); - } else { - x = x.clone(); - } + if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; - // A * x + B * y = x - var A = new BN(1); - var B = new BN(0); + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + var readableHwm = options.readableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; - // C * x + D * y = y - var C = new BN(0); - var D = new BN(1); + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm; - var g = 0; + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); - while (x.isEven() && y.isEven()) { - x.iushrn(1); - y.iushrn(1); - ++g; - } + // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; - var yp = y.clone(); - var xp = x.clone(); + // a flag to be able to tell if the event 'readable'/'data' is emitted + // immediately, or on a later tick. We set this to true at first, because + // any actions that shouldn't happen until "later" should generally also + // not happen before the first read call. + this.sync = true; - while (!x.isZero()) { - for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1); - if (i > 0) { - x.iushrn(i); - while (i-- > 0) { - if (A.isOdd() || B.isOdd()) { - A.iadd(yp); - B.isub(xp); - } + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; - A.iushrn(1); - B.iushrn(1); - } - } + // has it been destroyed + this.destroyed = false; - for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1); - if (j > 0) { - y.iushrn(j); - while (j-- > 0) { - if (C.isOdd() || D.isOdd()) { - C.iadd(yp); - D.isub(xp); - } + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; - C.iushrn(1); - D.iushrn(1); - } - } + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; - if (x.cmp(y) >= 0) { - x.isub(y); - A.isub(C); - B.isub(D); - } else { - y.isub(x); - C.isub(A); - D.isub(B); - } - } + // if true, a maybeReadMore has been scheduled + this.readingMore = false; - return { - a: C, - b: D, - gcd: y.iushln(g) - }; - }; + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} - // This is reduced incarnation of the binary EEA - // above, designated to invert members of the - // _prime_ fields F(p) at a maximal speed - BN.prototype._invmp = function _invmp (p) { - assert(p.negative === 0); - assert(!p.isZero()); +function Readable(options) { + Duplex = Duplex || require('./_stream_duplex'); - var a = this; - var b = p.clone(); + if (!(this instanceof Readable)) return new Readable(options); - if (a.negative !== 0) { - a = a.umod(p); - } else { - a = a.clone(); + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + if (options) { + if (typeof options.read === 'function') this._read = options.read; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + } + + Stream.call(this); +} + +Object.defineProperty(Readable.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined) { + return false; + } + return this._readableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._readableState) { + return; } - var x1 = new BN(1); - var x2 = new BN(0); + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + } +}); - var delta = b.clone(); +Readable.prototype.destroy = destroyImpl.destroy; +Readable.prototype._undestroy = destroyImpl.undestroy; +Readable.prototype._destroy = function (err, cb) { + this.push(null); + cb(err); +}; - while (a.cmpn(1) > 0 && b.cmpn(1) > 0) { - for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1); - if (i > 0) { - a.iushrn(i); - while (i-- > 0) { - if (x1.isOdd()) { - x1.iadd(delta); - } +// Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. +Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; + var skipChunkCheck; - x1.iushrn(1); - } + if (!state.objectMode) { + if (typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = Buffer.from(chunk, encoding); + encoding = ''; } + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } - for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1); - if (j > 0) { - b.iushrn(j); - while (j-- > 0) { - if (x2.isOdd()) { - x2.iadd(delta); - } + return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); +}; - x2.iushrn(1); - } +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function (chunk) { + return readableAddChunk(this, chunk, null, true, false); +}; + +function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { + var state = stream._readableState; + if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else { + var er; + if (!skipChunkCheck) er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { + chunk = _uint8ArrayToBuffer(chunk); } - if (a.cmp(b) >= 0) { - a.isub(b); - x1.isub(x2); + if (addToFront) { + if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true); + } else if (state.ended) { + stream.emit('error', new Error('stream.push() after EOF')); } else { - b.isub(a); - x2.isub(x1); + state.reading = false; + if (state.decoder && !encoding) { + chunk = state.decoder.write(chunk); + if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); + } else { + addChunk(stream, state, chunk, false); + } } + } else if (!addToFront) { + state.reading = false; } + } - var res; - if (a.cmpn(1) === 0) { - res = x1; - } else { - res = x2; - } + return needMoreData(state); +} - if (res.cmpn(0) < 0) { - res.iadd(p); - } +function addChunk(stream, state, chunk, addToFront) { + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); - return res; - }; + if (state.needReadable) emitReadable(stream); + } + maybeReadMore(stream, state); +} - BN.prototype.gcd = function gcd (num) { - if (this.isZero()) return num.abs(); - if (num.isZero()) return this.abs(); +function chunkInvalid(state, chunk) { + var er; + if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; +} - var a = this.clone(); - var b = num.clone(); - a.negative = 0; - b.negative = 0; +// if it's past the high water mark, we can push in some more. +// Also, if we have no data yet, we can stand some +// more bytes. This is to work around cases where hwm=0, +// such as the repl. Also, if the push() triggered a +// readable event, and the user called read(largeNumber) such that +// needReadable was set, then we ought to push more, so that another +// 'readable' event will be triggered. +function needMoreData(state) { + return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); +} - // Remove common factor of two - for (var shift = 0; a.isEven() && b.isEven(); shift++) { - a.iushrn(1); - b.iushrn(1); - } +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; - do { - while (a.isEven()) { - a.iushrn(1); - } - while (b.isEven()) { - b.iushrn(1); - } +// backwards compatibility. +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; +}; - var r = a.cmp(b); - if (r < 0) { - // Swap `a` and `b` to make `a` always bigger than `b` - var t = a; - a = b; - b = t; - } else if (r === 0 || b.cmpn(1) === 0) { - break; - } +// Don't raise the hwm > 8MB +var MAX_HWM = 0x800000; +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; +} - a.isub(b); - } while (true); +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function howMuchToRead(n, state) { + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } + // If we're asking for more than the current hwm, then raise the hwm. + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; + // Don't have enough + if (!state.ended) { + state.needReadable = true; + return 0; + } + return state.length; +} - return b.iushln(shift); - }; +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; - // Invert number in the field F(num) - BN.prototype.invm = function invm (num) { - return this.egcd(num).a.umod(num); - }; + if (n !== 0) state.emittedReadable = false; - BN.prototype.isEven = function isEven () { - return (this.words[0] & 1) === 0; - }; + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } - BN.prototype.isOdd = function isOdd () { - return (this.words[0] & 1) === 1; - }; + n = howMuchToRead(n, state); - // And first word and num - BN.prototype.andln = function andln (num) { - return this.words[0] & num; - }; + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } - // Increment at the bit position in-line - BN.prototype.bincn = function bincn (bit) { - assert(typeof bit === 'number'); - var r = bit % 26; - var s = (bit - r) / 26; - var q = 1 << r; + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. - // Fast case: bit is much higher than all existing words - if (this.length <= s) { - this._expand(s + 1); - this.words[s] |= q; - return this; - } + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + debug('need readable', doRead); - // Add bit and propagate, if needed - var carry = q; - for (var i = s; carry !== 0 && i < this.length; i++) { - var w = this.words[i] | 0; - w += carry; - carry = w >>> 26; - w &= 0x3ffffff; - this.words[i] = w; - } - if (carry !== 0) { - this.words[i] = carry; - this.length++; - } - return this; - }; + // if we currently have less than the highWaterMark, then also read some + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } - BN.prototype.isZero = function isZero () { - return this.length === 1 && this.words[0] === 0; - }; + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } else if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (!state.reading) n = howMuchToRead(nOrig, state); + } - BN.prototype.cmpn = function cmpn (num) { - var negative = num < 0; + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; - if (this.negative !== 0 && !negative) return -1; - if (this.negative === 0 && negative) return 1; + if (ret === null) { + state.needReadable = true; + n = 0; + } else { + state.length -= n; + } - this.strip(); + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; - var res; - if (this.length > 1) { - res = 1; - } else { - if (negative) { - num = -num; - } + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended) endReadable(this); + } - assert(num <= 0x3ffffff, 'Number is too big'); + if (ret !== null) this.emit('data', ret); - var w = this.words[0] | 0; - res = w === num ? 0 : w < num ? -1 : 1; - } - if (this.negative !== 0) return -res | 0; - return res; - }; + return ret; +}; - // Compare two numbers and return: - // 1 - if `this` > `num` - // 0 - if `this` == `num` - // -1 - if `this` < `num` - BN.prototype.cmp = function cmp (num) { - if (this.negative !== 0 && num.negative === 0) return -1; - if (this.negative === 0 && num.negative !== 0) return 1; +function onEofChunk(stream, state) { + if (state.ended) return; + if (state.decoder) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; - var res = this.ucmp(num); - if (this.negative !== 0) return -res | 0; - return res; - }; + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); +} - // Unsigned comparison - BN.prototype.ucmp = function ucmp (num) { - // At this point both numbers have the same sign - if (this.length > num.length) return 1; - if (this.length < num.length) return -1; +// Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. +function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream); + } +} - var res = 0; - for (var i = this.length - 1; i >= 0; i--) { - var a = this.words[i] | 0; - var b = num.words[i] | 0; +function emitReadable_(stream) { + debug('emit readable'); + stream.emit('readable'); + flow(stream); +} - if (a === b) continue; - if (a < b) { - res = -1; - } else if (a > b) { - res = 1; - } - break; - } - return res; - }; +// at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + pna.nextTick(maybeReadMore_, stream, state); + } +} - BN.prototype.gtn = function gtn (num) { - return this.cmpn(num) === 1; - }; +function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break;else len = state.length; + } + state.readingMore = false; +} - BN.prototype.gt = function gt (num) { - return this.cmp(num) === 1; - }; +// abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. +Readable.prototype._read = function (n) { + this.emit('error', new Error('_read() is not implemented')); +}; - BN.prototype.gten = function gten (num) { - return this.cmpn(num) >= 0; - }; +Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; - BN.prototype.gte = function gte (num) { - return this.cmp(num) >= 0; - }; + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); - BN.prototype.ltn = function ltn (num) { - return this.cmpn(num) === -1; - }; + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; - BN.prototype.lt = function lt (num) { - return this.cmp(num) === -1; - }; + var endFn = doEnd ? onend : unpipe; + if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn); - BN.prototype.lten = function lten (num) { - return this.cmpn(num) <= 0; - }; + dest.on('unpipe', onunpipe); + function onunpipe(readable, unpipeInfo) { + debug('onunpipe'); + if (readable === src) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + cleanup(); + } + } + } - BN.prototype.lte = function lte (num) { - return this.cmp(num) <= 0; - }; + function onend() { + debug('onend'); + dest.end(); + } - BN.prototype.eqn = function eqn (num) { - return this.cmpn(num) === 0; - }; + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); - BN.prototype.eq = function eq (num) { - return this.cmp(num) === 0; - }; + var cleanedUp = false; + function cleanup() { + debug('cleanup'); + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', unpipe); + src.removeListener('data', ondata); - // - // A reduce context, could be using montgomery or something better, depending - // on the `m` itself. - // - BN.red = function red (num) { - return new Red(num); - }; + cleanedUp = true; - BN.prototype.toRed = function toRed (ctx) { - assert(!this.red, 'Already a number in reduction context'); - assert(this.negative === 0, 'red works only with positives'); - return ctx.convertTo(this)._forceRed(ctx); - }; + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } - BN.prototype.fromRed = function fromRed () { - assert(this.red, 'fromRed works only with numbers in reduction context'); - return this.red.convertFrom(this); - }; + // If the user pushes more data while we're writing to dest then we'll end up + // in ondata again. However, we only want to increase awaitDrain once because + // dest will only emit one 'drain' event for the multiple writes. + // => Introduce a guard on increasing awaitDrain. + var increasedAwaitDrain = false; + src.on('data', ondata); + function ondata(chunk) { + debug('ondata'); + increasedAwaitDrain = false; + var ret = dest.write(chunk); + if (false === ret && !increasedAwaitDrain) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', src._readableState.awaitDrain); + src._readableState.awaitDrain++; + increasedAwaitDrain = true; + } + src.pause(); + } + } - BN.prototype._forceRed = function _forceRed (ctx) { - this.red = ctx; - return this; - }; + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); + } - BN.prototype.forceRed = function forceRed (ctx) { - assert(!this.red, 'Already a number in reduction context'); - return this._forceRed(ctx); - }; + // Make sure our error handler is attached before userland ones. + prependListener(dest, 'error', onerror); - BN.prototype.redAdd = function redAdd (num) { - assert(this.red, 'redAdd works only with red numbers'); - return this.red.add(this, num); - }; + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); - BN.prototype.redIAdd = function redIAdd (num) { - assert(this.red, 'redIAdd works only with red numbers'); - return this.red.iadd(this, num); - }; + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } - BN.prototype.redSub = function redSub (num) { - assert(this.red, 'redSub works only with red numbers'); - return this.red.sub(this, num); - }; + // tell the dest that it's being piped to + dest.emit('pipe', src); - BN.prototype.redISub = function redISub (num) { - assert(this.red, 'redISub works only with red numbers'); - return this.red.isub(this, num); - }; + // start the flow if it hasn't been started already. + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } - BN.prototype.redShl = function redShl (num) { - assert(this.red, 'redShl works only with red numbers'); - return this.red.shl(this, num); - }; + return dest; +}; - BN.prototype.redMul = function redMul (num) { - assert(this.red, 'redMul works only with red numbers'); - this.red._verify2(this, num); - return this.red.mul(this, num); +function pipeOnDrain(src) { + return function () { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } }; +} - BN.prototype.redIMul = function redIMul (num) { - assert(this.red, 'redMul works only with red numbers'); - this.red._verify2(this, num); - return this.red.imul(this, num); - }; +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; + var unpipeInfo = { hasUnpiped: false }; - BN.prototype.redSqr = function redSqr () { - assert(this.red, 'redSqr works only with red numbers'); - this.red._verify1(this); - return this.red.sqr(this); - }; + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) return this; - BN.prototype.redISqr = function redISqr () { - assert(this.red, 'redISqr works only with red numbers'); - this.red._verify1(this); - return this.red.isqr(this); - }; + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; - // Square root over p - BN.prototype.redSqrt = function redSqrt () { - assert(this.red, 'redSqrt works only with red numbers'); - this.red._verify1(this); - return this.red.sqrt(this); - }; + if (!dest) dest = state.pipes; - BN.prototype.redInvm = function redInvm () { - assert(this.red, 'redInvm works only with red numbers'); - this.red._verify1(this); - return this.red.invm(this); - }; + // got a match. + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this, unpipeInfo); + return this; + } - // Return negative clone of `this` % `red modulo` - BN.prototype.redNeg = function redNeg () { - assert(this.red, 'redNeg works only with red numbers'); - this.red._verify1(this); - return this.red.neg(this); - }; + // slow case. multiple pipe destinations. - BN.prototype.redPow = function redPow (num) { - assert(this.red && !num.red, 'redPow(normalNum)'); - this.red._verify1(this); - return this.red.pow(this, num); - }; + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; - // Prime numbers with efficient reduction - var primes = { - k256: null, - p224: null, - p192: null, - p25519: null - }; + for (var i = 0; i < len; i++) { + dests[i].emit('unpipe', this, unpipeInfo); + }return this; + } - // Pseudo-Mersenne prime - function MPrime (name, p) { - // P = 2 ^ N - K - this.name = name; - this.p = new BN(p, 16); - this.n = this.p.bitLength(); - this.k = new BN(1).iushln(this.n).isub(this.p); + // try to find the right one. + var index = indexOf(state.pipes, dest); + if (index === -1) return this; - this.tmp = this._tmp(); - } + state.pipes.splice(index, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; - MPrime.prototype._tmp = function _tmp () { - var tmp = new BN(null); - tmp.words = new Array(Math.ceil(this.n / 13)); - return tmp; - }; + dest.emit('unpipe', this, unpipeInfo); - MPrime.prototype.ireduce = function ireduce (num) { - // Assumes that `num` is less than `P^2` - // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P) - var r = num; - var rlen; + return this; +}; - do { - this.split(r, this.tmp); - r = this.imulK(r); - r = r.iadd(this.tmp); - rlen = r.bitLength(); - } while (rlen > this.n); +// set up data events if they are asked for +// Ensure readable listeners eventually get something +Readable.prototype.on = function (ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); - var cmp = rlen < this.n ? -1 : r.ucmp(this.p); - if (cmp === 0) { - r.words[0] = 0; - r.length = 1; - } else if (cmp > 0) { - r.isub(this.p); - } else { - r.strip(); + if (ev === 'data') { + // Start flowing on next tick if stream isn't explicitly paused + if (this._readableState.flowing !== false) this.resume(); + } else if (ev === 'readable') { + var state = this._readableState; + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.emittedReadable = false; + if (!state.reading) { + pna.nextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this); + } } + } - return r; - }; + return res; +}; +Readable.prototype.addListener = Readable.prototype.on; - MPrime.prototype.split = function split (input, out) { - input.iushrn(this.n, 0, out); - }; +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} - MPrime.prototype.imulK = function imulK (num) { - return num.imul(this.k); - }; +// pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. +Readable.prototype.resume = function () { + var state = this._readableState; + if (!state.flowing) { + debug('resume'); + state.flowing = true; + resume(this, state); + } + return this; +}; - function K256 () { - MPrime.call( - this, - 'k256', - 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f'); +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + pna.nextTick(resume_, stream, state); } - inherits(K256, MPrime); +} - K256.prototype.split = function split (input, output) { - // 256 = 9 * 26 + 22 - var mask = 0x3fffff; +function resume_(stream, state) { + if (!state.reading) { + debug('resume read 0'); + stream.read(0); + } - var outLen = Math.min(input.length, 9); - for (var i = 0; i < outLen; i++) { - output.words[i] = input.words[i]; - } - output.length = outLen; + state.resumeScheduled = false; + state.awaitDrain = 0; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); +} - if (input.length <= 9) { - input.words[0] = 0; - input.length = 1; - return; - } +Readable.prototype.pause = function () { + debug('call pause flowing=%j', this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + return this; +}; - // Shift by 9 limbs - var prev = input.words[9]; - output.words[output.length++] = prev & mask; +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + while (state.flowing && stream.read() !== null) {} +} - for (i = 10; i < input.length; i++) { - var next = input.words[i] | 0; - input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22); - prev = next; - } - prev >>>= 22; - input.words[i - 10] = prev; - if (prev === 0 && input.length > 10) { - input.length -= 10; - } else { - input.length -= 9; +// wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. +Readable.prototype.wrap = function (stream) { + var _this = this; + + var state = this._readableState; + var paused = false; + + stream.on('end', function () { + debug('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) _this.push(chunk); } - }; - K256.prototype.imulK = function imulK (num) { - // K = 0x1000003d1 = [ 0x40, 0x3d1 ] - num.words[num.length] = 0; - num.words[num.length + 1] = 0; - num.length += 2; + _this.push(null); + }); - // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390 - var lo = 0; - for (var i = 0; i < num.length; i++) { - var w = num.words[i] | 0; - lo += w * 0x3d1; - num.words[i] = lo & 0x3ffffff; - lo = w * 0x40 + ((lo / 0x4000000) | 0); - } + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); - // Fast length reduction - if (num.words[num.length - 1] === 0) { - num.length--; - if (num.words[num.length - 1] === 0) { - num.length--; - } - } - return num; - }; + // don't skip over falsy values in objectMode + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; - function P224 () { - MPrime.call( - this, - 'p224', - 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001'); - } - inherits(P224, MPrime); + var ret = _this.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); - function P192 () { - MPrime.call( - this, - 'p192', - 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff'); + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function (method) { + return function () { + return stream[method].apply(stream, arguments); + }; + }(i); + } } - inherits(P192, MPrime); - function P25519 () { - // 2 ^ 255 - 19 - MPrime.call( - this, - '25519', - '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed'); + // proxy certain important events. + for (var n = 0; n < kProxyEvents.length; n++) { + stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); } - inherits(P25519, MPrime); - - P25519.prototype.imulK = function imulK (num) { - // K = 0x13 - var carry = 0; - for (var i = 0; i < num.length; i++) { - var hi = (num.words[i] | 0) * 0x13 + carry; - var lo = hi & 0x3ffffff; - hi >>>= 26; - num.words[i] = lo; - carry = hi; - } - if (carry !== 0) { - num.words[num.length++] = carry; + // when we try to consume some more bytes, simply unpause the + // underlying stream. + this._read = function (n) { + debug('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); } - return num; }; - // Exported mostly for testing purposes, use plain name instead - BN._prime = function prime (name) { - // Cached version of prime - if (primes[name]) return primes[name]; - - var prime; - if (name === 'k256') { - prime = new K256(); - } else if (name === 'p224') { - prime = new P224(); - } else if (name === 'p192') { - prime = new P192(); - } else if (name === 'p25519') { - prime = new P25519(); - } else { - throw new Error('Unknown prime ' + name); - } - primes[name] = prime; - - return prime; - }; + return this; +}; - // - // Base reduction engine - // - function Red (m) { - if (typeof m === 'string') { - var prime = BN._prime(m); - this.m = prime.p; - this.prime = prime; - } else { - assert(m.gtn(1), 'modulus must be greater than 1'); - this.m = m; - this.prime = null; - } +Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._readableState.highWaterMark; } +}); - Red.prototype._verify1 = function _verify1 (a) { - assert(a.negative === 0, 'red works only with positives'); - assert(a.red, 'red works only with red numbers'); - }; +// exposed for testing purposes only. +Readable._fromList = fromList; - Red.prototype._verify2 = function _verify2 (a, b) { - assert((a.negative | b.negative) === 0, 'red works only with positives'); - assert(a.red && a.red === b.red, - 'red works only with red numbers'); - }; +// Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; - Red.prototype.imod = function imod (a) { - if (this.prime) return this.prime.ireduce(a)._forceRed(this); - return a.umod(this.m)._forceRed(this); - }; + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = fromListPartial(n, state.buffer, state.decoder); + } - Red.prototype.neg = function neg (a) { - if (a.isZero()) { - return a.clone(); - } + return ret; +} - return this.m.sub(a)._forceRed(this); - }; +// Extracts only enough buffered data to satisfy the amount requested. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromListPartial(n, list, hasStrings) { + var ret; + if (n < list.head.data.length) { + // slice is the same for buffers and strings + ret = list.head.data.slice(0, n); + list.head.data = list.head.data.slice(n); + } else if (n === list.head.data.length) { + // first chunk is a perfect match + ret = list.shift(); + } else { + // result spans more than one buffer + ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); + } + return ret; +} - Red.prototype.add = function add (a, b) { - this._verify2(a, b); +// Copies a specified amount of characters from the list of buffered data +// chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBufferString(n, list) { + var p = list.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} - var res = a.add(b); - if (res.cmp(this.m) >= 0) { - res.isub(this.m); +// Copies a specified amount of bytes from the list of buffered data chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBuffer(n, list) { + var ret = Buffer.allocUnsafe(n); + var p = list.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = buf.slice(nb); + } + break; } - return res._forceRed(this); - }; + ++c; + } + list.length -= c; + return ret; +} - Red.prototype.iadd = function iadd (a, b) { - this._verify2(a, b); +function endReadable(stream) { + var state = stream._readableState; - var res = a.iadd(b); - if (res.cmp(this.m) >= 0) { - res.isub(this.m); - } - return res; - }; + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); - Red.prototype.sub = function sub (a, b) { - this._verify2(a, b); + if (!state.endEmitted) { + state.ended = true; + pna.nextTick(endReadableNT, state, stream); + } +} - var res = a.sub(b); - if (res.cmpn(0) < 0) { - res.iadd(this.m); - } - return res._forceRed(this); - }; +function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } +} - Red.prototype.isub = function isub (a, b) { - this._verify2(a, b); +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; +} +},{"process-nextick-args":"Yj0v","isarray":"REa7","events":"FRpO","./internal/streams/stream":"Q8A6","safe-buffer":"l6K0","core-util-is":"Q14w","inherits":"Bm0n","util":"rDCW","./internal/streams/BufferList":"Um5I","./internal/streams/destroy":"avqi","./_stream_duplex":"wldW","string_decoder/":"F7WD","process":"pBGv"}],"I3bg":[function(require,module,exports) { +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. - var res = a.isub(b); - if (res.cmpn(0) < 0) { - res.iadd(this.m); - } - return res; - }; +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. - Red.prototype.shl = function shl (a, num) { - this._verify1(a); - return this.imod(a.ushln(num)); - }; +'use strict'; - Red.prototype.imul = function imul (a, b) { - this._verify2(a, b); - return this.imod(a.imul(b)); - }; +module.exports = Transform; - Red.prototype.mul = function mul (a, b) { - this._verify2(a, b); - return this.imod(a.mul(b)); - }; +var Duplex = require('./_stream_duplex'); - Red.prototype.isqr = function isqr (a) { - return this.imul(a, a.clone()); - }; +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ - Red.prototype.sqr = function sqr (a) { - return this.mul(a, a); - }; +util.inherits(Transform, Duplex); - Red.prototype.sqrt = function sqrt (a) { - if (a.isZero()) return a.clone(); +function afterTransform(er, data) { + var ts = this._transformState; + ts.transforming = false; - var mod3 = this.m.andln(3); - assert(mod3 % 2 === 1); + var cb = ts.writecb; - // Fast case - if (mod3 === 3) { - var pow = this.m.add(new BN(1)).iushrn(2); - return this.pow(a, pow); - } + if (!cb) { + return this.emit('error', new Error('write callback called multiple times')); + } - // Tonelli-Shanks algorithm (Totally unoptimized and slow) - // - // Find Q and S, that Q * 2 ^ S = (P - 1) - var q = this.m.subn(1); - var s = 0; - while (!q.isZero() && q.andln(1) === 0) { - s++; - q.iushrn(1); - } - assert(!q.isZero()); + ts.writechunk = null; + ts.writecb = null; - var one = new BN(1).toRed(this); - var nOne = one.redNeg(); + if (data != null) // single equals check for both `null` and `undefined` + this.push(data); - // Find quadratic non-residue - // NOTE: Max is such because of generalized Riemann hypothesis. - var lpow = this.m.subn(1).iushrn(1); - var z = this.m.bitLength(); - z = new BN(2 * z * z).toRed(this); + cb(er); - while (this.pow(z, lpow).cmp(nOne) !== 0) { - z.redIAdd(nOne); - } + var rs = this._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } +} - var c = this.pow(z, q); - var r = this.pow(a, q.addn(1).iushrn(1)); - var t = this.pow(a, q); - var m = s; - while (t.cmp(one) !== 0) { - var tmp = t; - for (var i = 0; tmp.cmp(one) !== 0; i++) { - tmp = tmp.redSqr(); - } - assert(i < m); - var b = this.pow(c, new BN(1).iushln(m - i - 1)); +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); - r = r.redMul(b); - c = b.redSqr(); - t = t.redMul(c); - m = i; - } + Duplex.call(this, options); - return r; + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null }; - Red.prototype.invm = function invm (a) { - var inv = a._invmp(this.m); - if (inv.negative !== 0) { - inv.negative = 0; - return this.imod(inv).redNeg(); - } else { - return this.imod(inv); - } - }; + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; - Red.prototype.pow = function pow (a, num) { - if (num.isZero()) return new BN(1).toRed(this); - if (num.cmpn(1) === 0) return a.clone(); + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; - var windowSize = 4; - var wnd = new Array(1 << windowSize); - wnd[0] = new BN(1).toRed(this); - wnd[1] = a; - for (var i = 2; i < wnd.length; i++) { - wnd[i] = this.mul(wnd[i - 1], a); - } + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; - var res = wnd[0]; - var current = 0; - var currentLen = 0; - var start = num.bitLength() % 26; - if (start === 0) { - start = 26; - } + if (typeof options.flush === 'function') this._flush = options.flush; + } - for (i = num.length - 1; i >= 0; i--) { - var word = num.words[i]; - for (var j = start - 1; j >= 0; j--) { - var bit = (word >> j) & 1; - if (res !== wnd[0]) { - res = this.sqr(res); - } + // When the writable side finishes, then flush out anything remaining. + this.on('prefinish', prefinish); +} - if (bit === 0 && current === 0) { - currentLen = 0; - continue; - } +function prefinish() { + var _this = this; - current <<= 1; - current |= bit; - currentLen++; - if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue; + if (typeof this._flush === 'function') { + this._flush(function (er, data) { + done(_this, er, data); + }); + } else { + done(this, null, null); + } +} - res = this.mul(res, wnd[current]); - currentLen = 0; - current = 0; - } - start = 26; - } +Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; - return res; - }; +// This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. +Transform.prototype._transform = function (chunk, encoding, cb) { + throw new Error('_transform() is not implemented'); +}; - Red.prototype.convertTo = function convertTo (num) { - var r = num.umod(this.m); +Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } +}; - return r === num ? r.clone() : r; - }; +// Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. +Transform.prototype._read = function (n) { + var ts = this._transformState; - Red.prototype.convertFrom = function convertFrom (num) { - var res = num.clone(); - res.red = null; - return res; - }; + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; - // - // Montgomery method engine - // +Transform.prototype._destroy = function (err, cb) { + var _this2 = this; - BN.mont = function mont (num) { - return new Mont(num); - }; + Duplex.prototype._destroy.call(this, err, function (err2) { + cb(err2); + _this2.emit('close'); + }); +}; - function Mont (m) { - Red.call(this, m); +function done(stream, er, data) { + if (er) return stream.emit('error', er); - this.shift = this.m.bitLength(); - if (this.shift % 26 !== 0) { - this.shift += 26 - (this.shift % 26); - } + if (data != null) // single equals check for both `null` and `undefined` + stream.push(data); - this.r = new BN(1).iushln(this.shift); - this.r2 = this.imod(this.r.sqr()); - this.rinv = this.r._invmp(this.m); + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0'); - this.minv = this.rinv.mul(this.r).isubn(1).div(this.m); - this.minv = this.minv.umod(this.r); - this.minv = this.r.sub(this.minv); - } - inherits(Mont, Red); + if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming'); - Mont.prototype.convertTo = function convertTo (num) { - return this.imod(num.ushln(this.shift)); - }; + return stream.push(null); +} +},{"./_stream_duplex":"wldW","core-util-is":"Q14w","inherits":"Bm0n"}],"kQBK":[function(require,module,exports) { +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. - Mont.prototype.convertFrom = function convertFrom (num) { - var r = this.imod(num.mul(this.rinv)); - r.red = null; - return r; - }; +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. - Mont.prototype.imul = function imul (a, b) { - if (a.isZero() || b.isZero()) { - a.words[0] = 0; - a.length = 1; - return a; - } +'use strict'; - var t = a.imul(b); - var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); - var u = t.isub(c).iushrn(this.shift); - var res = u; +module.exports = PassThrough; - if (u.cmp(this.m) >= 0) { - res = u.isub(this.m); - } else if (u.cmpn(0) < 0) { - res = u.iadd(this.m); - } +var Transform = require('./_stream_transform'); - return res._forceRed(this); - }; +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ - Mont.prototype.mul = function mul (a, b) { - if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this); +util.inherits(PassThrough, Transform); - var t = a.mul(b); - var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); - var u = t.isub(c).iushrn(this.shift); - var res = u; - if (u.cmp(this.m) >= 0) { - res = u.isub(this.m); - } else if (u.cmpn(0) < 0) { - res = u.iadd(this.m); - } +function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); - return res._forceRed(this); - }; + Transform.call(this, options); +} - Mont.prototype.invm = function invm (a) { - // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R - var res = this.imod(a._invmp(this.m).mul(this.r2)); - return res._forceRed(this); - }; -})(typeof module === 'undefined' || module, this); +PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); +}; +},{"./_stream_transform":"I3bg","core-util-is":"Q14w","inherits":"Bm0n"}],"uwsL":[function(require,module,exports) { +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Stream = exports; +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); -},{"buffer":"rDCW"}],"MpuC":[function(require,module,exports) { -module.exports = assert; +},{"./lib/_stream_readable.js":"Ogwm","./lib/_stream_writable.js":"I0x5","./lib/_stream_duplex.js":"wldW","./lib/_stream_transform.js":"I3bg","./lib/_stream_passthrough.js":"kQBK"}],"GAH2":[function(require,module,exports) { +module.exports = require('./lib/_stream_writable.js'); -function assert(val, msg) { - if (!val) - throw new Error(msg || 'Assertion failed'); -} +},{"./lib/_stream_writable.js":"I0x5"}],"dMbb":[function(require,module,exports) { +module.exports = require('./lib/_stream_duplex.js'); -assert.equal = function assertEqual(l, r, msg) { - if (l != r) - throw new Error(msg || ('Assertion failed: ' + l + ' != ' + r)); -}; +},{"./lib/_stream_duplex.js":"wldW"}],"yG3q":[function(require,module,exports) { +module.exports = require('./readable').Transform -},{}],"vl2S":[function(require,module,exports) { -'use strict'; +},{"./readable":"uwsL"}],"jlpe":[function(require,module,exports) { +module.exports = require('./readable').PassThrough -var utils = exports; +},{"./readable":"uwsL"}],"fnRj":[function(require,module,exports) { +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. -function toArray(msg, enc) { - if (Array.isArray(msg)) - return msg.slice(); - if (!msg) - return []; - var res = []; - if (typeof msg !== 'string') { - for (var i = 0; i < msg.length; i++) - res[i] = msg[i] | 0; - return res; - } - if (enc === 'hex') { - msg = msg.replace(/[^a-z0-9]+/ig, ''); - if (msg.length % 2 !== 0) - msg = '0' + msg; - for (var i = 0; i < msg.length; i += 2) - res.push(parseInt(msg[i] + msg[i + 1], 16)); - } else { - for (var i = 0; i < msg.length; i++) { - var c = msg.charCodeAt(i); - var hi = c >> 8; - var lo = c & 0xff; - if (hi) - res.push(hi, lo); - else - res.push(lo); - } - } - return res; -} -utils.toArray = toArray; +module.exports = Stream; -function zero2(word) { - if (word.length === 1) - return '0' + word; - else - return word; -} -utils.zero2 = zero2; +var EE = require('events').EventEmitter; +var inherits = require('inherits'); -function toHex(msg) { - var res = ''; - for (var i = 0; i < msg.length; i++) - res += zero2(msg[i].toString(16)); - return res; -} -utils.toHex = toHex; +inherits(Stream, EE); +Stream.Readable = require('readable-stream/readable.js'); +Stream.Writable = require('readable-stream/writable.js'); +Stream.Duplex = require('readable-stream/duplex.js'); +Stream.Transform = require('readable-stream/transform.js'); +Stream.PassThrough = require('readable-stream/passthrough.js'); -utils.encode = function encode(arr, enc) { - if (enc === 'hex') - return toHex(arr); - else - return arr; -}; +// Backwards-compat with node 0.4.x +Stream.Stream = Stream; -},{}],"F8Ez":[function(require,module,exports) { -'use strict'; -var utils = exports; -var BN = require('bn.js'); -var minAssert = require('minimalistic-assert'); -var minUtils = require('minimalistic-crypto-utils'); -utils.assert = minAssert; -utils.toArray = minUtils.toArray; -utils.zero2 = minUtils.zero2; -utils.toHex = minUtils.toHex; -utils.encode = minUtils.encode; +// old-style streams. Note that the pipe method (the only relevant +// part of this class) is overridden in the Readable class. -// Represent num in a w-NAF form -function getNAF(num, w) { - var naf = []; - var ws = 1 << (w + 1); - var k = num.clone(); - while (k.cmpn(1) >= 0) { - var z; - if (k.isOdd()) { - var mod = k.andln(ws - 1); - if (mod > (ws >> 1) - 1) - z = (ws >> 1) - mod; - else - z = mod; - k.isubn(z); - } else { - z = 0; +function Stream() { + EE.call(this); +} + +Stream.prototype.pipe = function(dest, options) { + var source = this; + + function ondata(chunk) { + if (dest.writable) { + if (false === dest.write(chunk) && source.pause) { + source.pause(); + } } - naf.push(z); + } - // Optimization, shift by word if possible - var shift = (k.cmpn(0) !== 0 && k.andln(ws - 1) === 0) ? (w + 1) : 1; - for (var i = 1; i < shift; i++) - naf.push(0); - k.iushrn(shift); + source.on('data', ondata); + + function ondrain() { + if (source.readable && source.resume) { + source.resume(); + } } - return naf; -} -utils.getNAF = getNAF; + dest.on('drain', ondrain); -// Represent k1, k2 in a Joint Sparse Form -function getJSF(k1, k2) { - var jsf = [ - [], - [] - ]; + // If the 'end' option is not supplied, dest.end() will be called when + // source gets the 'end' or 'close' events. Only dest.end() once. + if (!dest._isStdio && (!options || options.end !== false)) { + source.on('end', onend); + source.on('close', onclose); + } - k1 = k1.clone(); - k2 = k2.clone(); - var d1 = 0; - var d2 = 0; - while (k1.cmpn(-d1) > 0 || k2.cmpn(-d2) > 0) { + var didOnEnd = false; + function onend() { + if (didOnEnd) return; + didOnEnd = true; - // First phase - var m14 = (k1.andln(3) + d1) & 3; - var m24 = (k2.andln(3) + d2) & 3; - if (m14 === 3) - m14 = -1; - if (m24 === 3) - m24 = -1; - var u1; - if ((m14 & 1) === 0) { - u1 = 0; - } else { - var m8 = (k1.andln(7) + d1) & 7; - if ((m8 === 3 || m8 === 5) && m24 === 2) - u1 = -m14; - else - u1 = m14; - } - jsf[0].push(u1); + dest.end(); + } - var u2; - if ((m24 & 1) === 0) { - u2 = 0; - } else { - var m8 = (k2.andln(7) + d2) & 7; - if ((m8 === 3 || m8 === 5) && m14 === 2) - u2 = -m24; - else - u2 = m24; - } - jsf[1].push(u2); - // Second phase - if (2 * d1 === u1 + 1) - d1 = 1 - d1; - if (2 * d2 === u2 + 1) - d2 = 1 - d2; - k1.iushrn(1); - k2.iushrn(1); + function onclose() { + if (didOnEnd) return; + didOnEnd = true; + + if (typeof dest.destroy === 'function') dest.destroy(); } - return jsf; -} -utils.getJSF = getJSF; + // don't leave dangling pipes when there are errors. + function onerror(er) { + cleanup(); + if (EE.listenerCount(this, 'error') === 0) { + throw er; // Unhandled stream error in pipe. + } + } -function cachedProperty(obj, name, computer) { - var key = '_' + name; - obj.prototype[name] = function cachedProperty() { - return this[key] !== undefined ? this[key] : - this[key] = computer.call(this); - }; -} -utils.cachedProperty = cachedProperty; + source.on('error', onerror); + dest.on('error', onerror); -function parseBytes(bytes) { - return typeof bytes === 'string' ? utils.toArray(bytes, 'hex') : - bytes; -} -utils.parseBytes = parseBytes; + // remove all the event listeners that were added. + function cleanup() { + source.removeListener('data', ondata); + dest.removeListener('drain', ondrain); -function intFromLE(bytes) { - return new BN(bytes, 'hex', 'le'); -} -utils.intFromLE = intFromLE; + source.removeListener('end', onend); + source.removeListener('close', onclose); + source.removeListener('error', onerror); + dest.removeListener('error', onerror); -},{"bn.js":"BOxy","minimalistic-assert":"MpuC","minimalistic-crypto-utils":"vl2S"}],"e03B":[function(require,module,exports) { -var r; + source.removeListener('end', cleanup); + source.removeListener('close', cleanup); -module.exports = function rand(len) { - if (!r) - r = new Rand(null); + dest.removeListener('close', cleanup); + } - return r.generate(len); -}; + source.on('end', cleanup); + source.on('close', cleanup); -function Rand(rand) { - this.rand = rand; -} -module.exports.Rand = Rand; + dest.on('close', cleanup); -Rand.prototype.generate = function generate(len) { - return this._rand(len); + dest.emit('pipe', source); + + // Allow for unix-like usage: A.pipe(B).pipe(C) + return dest; }; -// Emulate crypto API using randy -Rand.prototype._rand = function _rand(n) { - if (this.rand.getBytes) - return this.rand.getBytes(n); +},{"events":"FRpO","inherits":"Bm0n","readable-stream/readable.js":"uwsL","readable-stream/writable.js":"GAH2","readable-stream/duplex.js":"dMbb","readable-stream/transform.js":"yG3q","readable-stream/passthrough.js":"jlpe"}],"UcQW":[function(require,module,exports) { - var res = new Uint8Array(n); - for (var i = 0; i < res.length; i++) - res[i] = this.rand.getByte(); - return res; -}; +'use strict'; -if (typeof self === 'object') { - if (self.crypto && self.crypto.getRandomValues) { - // Modern browsers - Rand.prototype._rand = function _rand(n) { - var arr = new Uint8Array(n); - self.crypto.getRandomValues(arr); - return arr; - }; - } else if (self.msCrypto && self.msCrypto.getRandomValues) { - // IE - Rand.prototype._rand = function _rand(n) { - var arr = new Uint8Array(n); - self.msCrypto.getRandomValues(arr); - return arr; - }; +var Buffer = require('safe-buffer').Buffer; - // Safari's WebWorkers do not have `crypto` - } else if (typeof window === 'object') { - // Old junk - Rand.prototype._rand = function() { - throw new Error('Not implemented yet'); - }; - } -} else { - // Node.js or Web worker with no crypto support - try { - var crypto = require('crypto'); - if (typeof crypto.randomBytes !== 'function') - throw new Error('Not supported'); +var Transform = require('stream').Transform; - Rand.prototype._rand = function _rand(n) { - return crypto.randomBytes(n); - }; - } catch (e) { +var inherits = require('inherits'); + +function throwIfNotStringOrBuffer(val, prefix) { + if (!Buffer.isBuffer(val) && typeof val !== 'string') { + throw new TypeError(prefix + ' must be a string or a buffer'); } } -},{"crypto":"rDCW"}],"NX8i":[function(require,module,exports) { -'use strict'; - -var BN = require('bn.js'); -var utils = require('../utils'); -var getNAF = utils.getNAF; -var getJSF = utils.getJSF; -var assert = utils.assert; +function HashBase(blockSize) { + Transform.call(this); + this._block = Buffer.allocUnsafe(blockSize); + this._blockSize = blockSize; + this._blockOffset = 0; + this._length = [0, 0, 0, 0]; + this._finalized = false; +} -function BaseCurve(type, conf) { - this.type = type; - this.p = new BN(conf.p, 16); +inherits(HashBase, Transform); - // Use Montgomery, when there is no fast reduction for the prime - this.red = conf.prime ? BN.red(conf.prime) : BN.mont(this.p); +HashBase.prototype._transform = function (chunk, encoding, callback) { + var error = null; - // Useful for many curves - this.zero = new BN(0).toRed(this.red); - this.one = new BN(1).toRed(this.red); - this.two = new BN(2).toRed(this.red); + try { + this.update(chunk, encoding); + } catch (err) { + error = err; + } - // Curve configuration, optional - this.n = conf.n && new BN(conf.n, 16); - this.g = conf.g && this.pointFromJSON(conf.g, conf.gRed); + callback(error); +}; - // Temporary arrays - this._wnafT1 = new Array(4); - this._wnafT2 = new Array(4); - this._wnafT3 = new Array(4); - this._wnafT4 = new Array(4); +HashBase.prototype._flush = function (callback) { + var error = null; - // Generalized Greg Maxwell's trick - var adjustCount = this.n && this.p.div(this.n); - if (!adjustCount || adjustCount.cmpn(100) > 0) { - this.redN = null; - } else { - this._maxwellTrick = true; - this.redN = this.n.toRed(this.red); + try { + this.push(this.digest()); + } catch (err) { + error = err; } -} -module.exports = BaseCurve; -BaseCurve.prototype.point = function point() { - throw new Error('Not implemented'); + callback(error); }; -BaseCurve.prototype.validate = function validate() { - throw new Error('Not implemented'); -}; +HashBase.prototype.update = function (data, encoding) { + throwIfNotStringOrBuffer(data, 'Data'); + if (this._finalized) throw new Error('Digest already called'); + if (!Buffer.isBuffer(data)) data = Buffer.from(data, encoding); // consume data -BaseCurve.prototype._fixedNafMul = function _fixedNafMul(p, k) { - assert(p.precomputed); - var doubles = p._getDoubles(); + var block = this._block; + var offset = 0; - var naf = getNAF(k, 1); - var I = (1 << (doubles.step + 1)) - (doubles.step % 2 === 0 ? 2 : 1); - I /= 3; + while (this._blockOffset + data.length - offset >= this._blockSize) { + for (var i = this._blockOffset; i < this._blockSize;) block[i++] = data[offset++]; - // Translate into more windowed form - var repr = []; - for (var j = 0; j < naf.length; j += doubles.step) { - var nafW = 0; - for (var k = j + doubles.step - 1; k >= j; k--) - nafW = (nafW << 1) + naf[k]; - repr.push(nafW); - } + this._update(); - var a = this.jpoint(null, null, null); - var b = this.jpoint(null, null, null); - for (var i = I; i > 0; i--) { - for (var j = 0; j < repr.length; j++) { - var nafW = repr[j]; - if (nafW === i) - b = b.mixedAdd(doubles.points[j]); - else if (nafW === -i) - b = b.mixedAdd(doubles.points[j].neg()); - } - a = a.add(b); + this._blockOffset = 0; } - return a.toP(); -}; - -BaseCurve.prototype._wnafMul = function _wnafMul(p, k) { - var w = 4; - - // Precompute window - var nafPoints = p._getNAFPoints(w); - w = nafPoints.wnd; - var wnd = nafPoints.points; - // Get NAF form - var naf = getNAF(k, w); + while (offset < data.length) block[this._blockOffset++] = data[offset++]; // update length - // Add `this`*(N+1) for every w-NAF index - var acc = this.jpoint(null, null, null); - for (var i = naf.length - 1; i >= 0; i--) { - // Count zeroes - for (var k = 0; i >= 0 && naf[i] === 0; i--) - k++; - if (i >= 0) - k++; - acc = acc.dblp(k); - if (i < 0) - break; - var z = naf[i]; - assert(z !== 0); - if (p.type === 'affine') { - // J +- P - if (z > 0) - acc = acc.mixedAdd(wnd[(z - 1) >> 1]); - else - acc = acc.mixedAdd(wnd[(-z - 1) >> 1].neg()); - } else { - // J +- J - if (z > 0) - acc = acc.add(wnd[(z - 1) >> 1]); - else - acc = acc.add(wnd[(-z - 1) >> 1].neg()); - } + for (var j = 0, carry = data.length * 8; carry > 0; ++j) { + this._length[j] += carry; + carry = this._length[j] / 0x0100000000 | 0; + if (carry > 0) this._length[j] -= 0x0100000000 * carry; } - return p.type === 'affine' ? acc.toP() : acc; + + return this; }; -BaseCurve.prototype._wnafMulAdd = function _wnafMulAdd(defW, - points, - coeffs, - len, - jacobianResult) { - var wndWidth = this._wnafT1; - var wnd = this._wnafT2; - var naf = this._wnafT3; +HashBase.prototype._update = function () { + throw new Error('_update is not implemented'); +}; - // Fill all arrays - var max = 0; - for (var i = 0; i < len; i++) { - var p = points[i]; - var nafPoints = p._getNAFPoints(defW); - wndWidth[i] = nafPoints.wnd; - wnd[i] = nafPoints.points; - } +HashBase.prototype.digest = function (encoding) { + if (this._finalized) throw new Error('Digest already called'); + this._finalized = true; - // Comb small window NAFs - for (var i = len - 1; i >= 1; i -= 2) { - var a = i - 1; - var b = i; - if (wndWidth[a] !== 1 || wndWidth[b] !== 1) { - naf[a] = getNAF(coeffs[a], wndWidth[a]); - naf[b] = getNAF(coeffs[b], wndWidth[b]); - max = Math.max(naf[a].length, max); - max = Math.max(naf[b].length, max); - continue; - } + var digest = this._digest(); - var comb = [ - points[a], /* 1 */ - null, /* 3 */ - null, /* 5 */ - points[b] /* 7 */ - ]; + if (encoding !== undefined) digest = digest.toString(encoding); // reset state - // Try to avoid Projective points, if possible - if (points[a].y.cmp(points[b].y) === 0) { - comb[1] = points[a].add(points[b]); - comb[2] = points[a].toJ().mixedAdd(points[b].neg()); - } else if (points[a].y.cmp(points[b].y.redNeg()) === 0) { - comb[1] = points[a].toJ().mixedAdd(points[b]); - comb[2] = points[a].add(points[b].neg()); - } else { - comb[1] = points[a].toJ().mixedAdd(points[b]); - comb[2] = points[a].toJ().mixedAdd(points[b].neg()); - } + this._block.fill(0); - var index = [ - -3, /* -1 -1 */ - -1, /* -1 0 */ - -5, /* -1 1 */ - -7, /* 0 -1 */ - 0, /* 0 0 */ - 7, /* 0 1 */ - 5, /* 1 -1 */ - 1, /* 1 0 */ - 3 /* 1 1 */ - ]; + this._blockOffset = 0; - var jsf = getJSF(coeffs[a], coeffs[b]); - max = Math.max(jsf[0].length, max); - naf[a] = new Array(max); - naf[b] = new Array(max); - for (var j = 0; j < max; j++) { - var ja = jsf[0][j] | 0; - var jb = jsf[1][j] | 0; + for (var i = 0; i < 4; ++i) this._length[i] = 0; - naf[a][j] = index[(ja + 1) * 3 + (jb + 1)]; - naf[b][j] = 0; - wnd[a] = comb; - } - } + return digest; +}; - var acc = this.jpoint(null, null, null); - var tmp = this._wnafT4; - for (var i = max; i >= 0; i--) { - var k = 0; +HashBase.prototype._digest = function () { + throw new Error('_digest is not implemented'); +}; - while (i >= 0) { - var zero = true; - for (var j = 0; j < len; j++) { - tmp[j] = naf[j][i] | 0; - if (tmp[j] !== 0) - zero = false; - } - if (!zero) - break; - k++; - i--; - } - if (i >= 0) - k++; - acc = acc.dblp(k); - if (i < 0) - break; +module.exports = HashBase; +},{"safe-buffer":"Wugr","stream":"fnRj","inherits":"Bm0n"}],"OP64":[function(require,module,exports) { - for (var j = 0; j < len; j++) { - var z = tmp[j]; - var p; - if (z === 0) - continue; - else if (z > 0) - p = wnd[j][(z - 1) >> 1]; - else if (z < 0) - p = wnd[j][(-z - 1) >> 1].neg(); +'use strict' +var inherits = require('inherits') +var HashBase = require('hash-base') +var Buffer = require('safe-buffer').Buffer - if (p.type === 'affine') - acc = acc.mixedAdd(p); - else - acc = acc.add(p); - } - } - // Zeroify references - for (var i = 0; i < len; i++) - wnd[i] = null; +var ARRAY16 = new Array(16) - if (jacobianResult) - return acc; - else - return acc.toP(); -}; +function MD5 () { + HashBase.call(this, 64) -function BasePoint(curve, type) { - this.curve = curve; - this.type = type; - this.precomputed = null; + // state + this._a = 0x67452301 + this._b = 0xefcdab89 + this._c = 0x98badcfe + this._d = 0x10325476 } -BaseCurve.BasePoint = BasePoint; - -BasePoint.prototype.eq = function eq(/*other*/) { - throw new Error('Not implemented'); -}; -BasePoint.prototype.validate = function validate() { - return this.curve.validate(this); -}; +inherits(MD5, HashBase) -BaseCurve.prototype.decodePoint = function decodePoint(bytes, enc) { - bytes = utils.toArray(bytes, enc); +MD5.prototype._update = function () { + var M = ARRAY16 + for (var i = 0; i < 16; ++i) M[i] = this._block.readInt32LE(i * 4) - var len = this.p.byteLength(); + var a = this._a + var b = this._b + var c = this._c + var d = this._d - // uncompressed, hybrid-odd, hybrid-even - if ((bytes[0] === 0x04 || bytes[0] === 0x06 || bytes[0] === 0x07) && - bytes.length - 1 === 2 * len) { - if (bytes[0] === 0x06) - assert(bytes[bytes.length - 1] % 2 === 0); - else if (bytes[0] === 0x07) - assert(bytes[bytes.length - 1] % 2 === 1); + a = fnF(a, b, c, d, M[0], 0xd76aa478, 7) + d = fnF(d, a, b, c, M[1], 0xe8c7b756, 12) + c = fnF(c, d, a, b, M[2], 0x242070db, 17) + b = fnF(b, c, d, a, M[3], 0xc1bdceee, 22) + a = fnF(a, b, c, d, M[4], 0xf57c0faf, 7) + d = fnF(d, a, b, c, M[5], 0x4787c62a, 12) + c = fnF(c, d, a, b, M[6], 0xa8304613, 17) + b = fnF(b, c, d, a, M[7], 0xfd469501, 22) + a = fnF(a, b, c, d, M[8], 0x698098d8, 7) + d = fnF(d, a, b, c, M[9], 0x8b44f7af, 12) + c = fnF(c, d, a, b, M[10], 0xffff5bb1, 17) + b = fnF(b, c, d, a, M[11], 0x895cd7be, 22) + a = fnF(a, b, c, d, M[12], 0x6b901122, 7) + d = fnF(d, a, b, c, M[13], 0xfd987193, 12) + c = fnF(c, d, a, b, M[14], 0xa679438e, 17) + b = fnF(b, c, d, a, M[15], 0x49b40821, 22) - var res = this.point(bytes.slice(1, 1 + len), - bytes.slice(1 + len, 1 + 2 * len)); + a = fnG(a, b, c, d, M[1], 0xf61e2562, 5) + d = fnG(d, a, b, c, M[6], 0xc040b340, 9) + c = fnG(c, d, a, b, M[11], 0x265e5a51, 14) + b = fnG(b, c, d, a, M[0], 0xe9b6c7aa, 20) + a = fnG(a, b, c, d, M[5], 0xd62f105d, 5) + d = fnG(d, a, b, c, M[10], 0x02441453, 9) + c = fnG(c, d, a, b, M[15], 0xd8a1e681, 14) + b = fnG(b, c, d, a, M[4], 0xe7d3fbc8, 20) + a = fnG(a, b, c, d, M[9], 0x21e1cde6, 5) + d = fnG(d, a, b, c, M[14], 0xc33707d6, 9) + c = fnG(c, d, a, b, M[3], 0xf4d50d87, 14) + b = fnG(b, c, d, a, M[8], 0x455a14ed, 20) + a = fnG(a, b, c, d, M[13], 0xa9e3e905, 5) + d = fnG(d, a, b, c, M[2], 0xfcefa3f8, 9) + c = fnG(c, d, a, b, M[7], 0x676f02d9, 14) + b = fnG(b, c, d, a, M[12], 0x8d2a4c8a, 20) - return res; - } else if ((bytes[0] === 0x02 || bytes[0] === 0x03) && - bytes.length - 1 === len) { - return this.pointFromX(bytes.slice(1, 1 + len), bytes[0] === 0x03); - } - throw new Error('Unknown point format'); -}; + a = fnH(a, b, c, d, M[5], 0xfffa3942, 4) + d = fnH(d, a, b, c, M[8], 0x8771f681, 11) + c = fnH(c, d, a, b, M[11], 0x6d9d6122, 16) + b = fnH(b, c, d, a, M[14], 0xfde5380c, 23) + a = fnH(a, b, c, d, M[1], 0xa4beea44, 4) + d = fnH(d, a, b, c, M[4], 0x4bdecfa9, 11) + c = fnH(c, d, a, b, M[7], 0xf6bb4b60, 16) + b = fnH(b, c, d, a, M[10], 0xbebfbc70, 23) + a = fnH(a, b, c, d, M[13], 0x289b7ec6, 4) + d = fnH(d, a, b, c, M[0], 0xeaa127fa, 11) + c = fnH(c, d, a, b, M[3], 0xd4ef3085, 16) + b = fnH(b, c, d, a, M[6], 0x04881d05, 23) + a = fnH(a, b, c, d, M[9], 0xd9d4d039, 4) + d = fnH(d, a, b, c, M[12], 0xe6db99e5, 11) + c = fnH(c, d, a, b, M[15], 0x1fa27cf8, 16) + b = fnH(b, c, d, a, M[2], 0xc4ac5665, 23) -BasePoint.prototype.encodeCompressed = function encodeCompressed(enc) { - return this.encode(enc, true); -}; + a = fnI(a, b, c, d, M[0], 0xf4292244, 6) + d = fnI(d, a, b, c, M[7], 0x432aff97, 10) + c = fnI(c, d, a, b, M[14], 0xab9423a7, 15) + b = fnI(b, c, d, a, M[5], 0xfc93a039, 21) + a = fnI(a, b, c, d, M[12], 0x655b59c3, 6) + d = fnI(d, a, b, c, M[3], 0x8f0ccc92, 10) + c = fnI(c, d, a, b, M[10], 0xffeff47d, 15) + b = fnI(b, c, d, a, M[1], 0x85845dd1, 21) + a = fnI(a, b, c, d, M[8], 0x6fa87e4f, 6) + d = fnI(d, a, b, c, M[15], 0xfe2ce6e0, 10) + c = fnI(c, d, a, b, M[6], 0xa3014314, 15) + b = fnI(b, c, d, a, M[13], 0x4e0811a1, 21) + a = fnI(a, b, c, d, M[4], 0xf7537e82, 6) + d = fnI(d, a, b, c, M[11], 0xbd3af235, 10) + c = fnI(c, d, a, b, M[2], 0x2ad7d2bb, 15) + b = fnI(b, c, d, a, M[9], 0xeb86d391, 21) -BasePoint.prototype._encode = function _encode(compact) { - var len = this.curve.p.byteLength(); - var x = this.getX().toArray('be', len); + this._a = (this._a + a) | 0 + this._b = (this._b + b) | 0 + this._c = (this._c + c) | 0 + this._d = (this._d + d) | 0 +} - if (compact) - return [ this.getY().isEven() ? 0x02 : 0x03 ].concat(x); +MD5.prototype._digest = function () { + // create padding and handle blocks + this._block[this._blockOffset++] = 0x80 + if (this._blockOffset > 56) { + this._block.fill(0, this._blockOffset, 64) + this._update() + this._blockOffset = 0 + } - return [ 0x04 ].concat(x, this.getY().toArray('be', len)) ; -}; + this._block.fill(0, this._blockOffset, 56) + this._block.writeUInt32LE(this._length[0], 56) + this._block.writeUInt32LE(this._length[1], 60) + this._update() -BasePoint.prototype.encode = function encode(enc, compact) { - return utils.encode(this._encode(compact), enc); -}; + // produce result + var buffer = Buffer.allocUnsafe(16) + buffer.writeInt32LE(this._a, 0) + buffer.writeInt32LE(this._b, 4) + buffer.writeInt32LE(this._c, 8) + buffer.writeInt32LE(this._d, 12) + return buffer +} -BasePoint.prototype.precompute = function precompute(power) { - if (this.precomputed) - return this; +function rotl (x, n) { + return (x << n) | (x >>> (32 - n)) +} - var precomputed = { - doubles: null, - naf: null, - beta: null - }; - precomputed.naf = this._getNAFPoints(8); - precomputed.doubles = this._getDoubles(4, power); - precomputed.beta = this._getBeta(); - this.precomputed = precomputed; +function fnF (a, b, c, d, m, k, s) { + return (rotl((a + ((b & c) | ((~b) & d)) + m + k) | 0, s) + b) | 0 +} - return this; -}; +function fnG (a, b, c, d, m, k, s) { + return (rotl((a + ((b & d) | (c & (~d))) + m + k) | 0, s) + b) | 0 +} -BasePoint.prototype._hasDoubles = function _hasDoubles(k) { - if (!this.precomputed) - return false; +function fnH (a, b, c, d, m, k, s) { + return (rotl((a + (b ^ c ^ d) + m + k) | 0, s) + b) | 0 +} - var doubles = this.precomputed.doubles; - if (!doubles) - return false; +function fnI (a, b, c, d, m, k, s) { + return (rotl((a + ((c ^ (b | (~d)))) + m + k) | 0, s) + b) | 0 +} - return doubles.points.length >= Math.ceil((k.bitLength() + 1) / doubles.step); -}; +module.exports = MD5 -BasePoint.prototype._getDoubles = function _getDoubles(step, power) { - if (this.precomputed && this.precomputed.doubles) - return this.precomputed.doubles; +},{"inherits":"Bm0n","hash-base":"UcQW","safe-buffer":"Wugr"}],"quyi":[function(require,module,exports) { - var doubles = [ this ]; - var acc = this; - for (var i = 0; i < power; i += step) { - for (var j = 0; j < step; j++) - acc = acc.dbl(); - doubles.push(acc); - } - return { - step: step, - points: doubles - }; -}; +'use strict' +var Buffer = require('buffer').Buffer +var inherits = require('inherits') +var HashBase = require('hash-base') -BasePoint.prototype._getNAFPoints = function _getNAFPoints(wnd) { - if (this.precomputed && this.precomputed.naf) - return this.precomputed.naf; +var ARRAY16 = new Array(16) - var res = [ this ]; - var max = (1 << wnd) - 1; - var dbl = max === 1 ? null : this.dbl(); - for (var i = 1; i < max; i++) - res[i] = res[i - 1].add(dbl); - return { - wnd: wnd, - points: res - }; -}; +var zl = [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, + 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, + 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, + 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13 +] -BasePoint.prototype._getBeta = function _getBeta() { - return null; -}; +var zr = [ + 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, + 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, + 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, + 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, + 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11 +] -BasePoint.prototype.dblp = function dblp(k) { - var r = this; - for (var i = 0; i < k; i++) - r = r.dbl(); - return r; -}; +var sl = [ + 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, + 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, + 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, + 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, + 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 +] -},{"bn.js":"BOxy","../utils":"F8Ez"}],"Bm0n":[function(require,module,exports) { -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - if (superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }) - } - }; -} else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - if (superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor +var sr = [ + 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, + 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, + 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, + 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, + 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 +] + +var hl = [0x00000000, 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xa953fd4e] +var hr = [0x50a28be6, 0x5c4dd124, 0x6d703ef3, 0x7a6d76e9, 0x00000000] + +function RIPEMD160 () { + HashBase.call(this, 64) + + // state + this._a = 0x67452301 + this._b = 0xefcdab89 + this._c = 0x98badcfe + this._d = 0x10325476 + this._e = 0xc3d2e1f0 +} + +inherits(RIPEMD160, HashBase) + +RIPEMD160.prototype._update = function () { + var words = ARRAY16 + for (var j = 0; j < 16; ++j) words[j] = this._block.readInt32LE(j * 4) + + var al = this._a | 0 + var bl = this._b | 0 + var cl = this._c | 0 + var dl = this._d | 0 + var el = this._e | 0 + + var ar = this._a | 0 + var br = this._b | 0 + var cr = this._c | 0 + var dr = this._d | 0 + var er = this._e | 0 + + // computation + for (var i = 0; i < 80; i += 1) { + var tl + var tr + if (i < 16) { + tl = fn1(al, bl, cl, dl, el, words[zl[i]], hl[0], sl[i]) + tr = fn5(ar, br, cr, dr, er, words[zr[i]], hr[0], sr[i]) + } else if (i < 32) { + tl = fn2(al, bl, cl, dl, el, words[zl[i]], hl[1], sl[i]) + tr = fn4(ar, br, cr, dr, er, words[zr[i]], hr[1], sr[i]) + } else if (i < 48) { + tl = fn3(al, bl, cl, dl, el, words[zl[i]], hl[2], sl[i]) + tr = fn3(ar, br, cr, dr, er, words[zr[i]], hr[2], sr[i]) + } else if (i < 64) { + tl = fn4(al, bl, cl, dl, el, words[zl[i]], hl[3], sl[i]) + tr = fn2(ar, br, cr, dr, er, words[zr[i]], hr[3], sr[i]) + } else { // if (i<80) { + tl = fn5(al, bl, cl, dl, el, words[zl[i]], hl[4], sl[i]) + tr = fn1(ar, br, cr, dr, er, words[zr[i]], hr[4], sr[i]) } + + al = el + el = dl + dl = rotl(cl, 10) + cl = bl + bl = tl + + ar = er + er = dr + dr = rotl(cr, 10) + cr = br + br = tr } + + // update state + var t = (this._b + cl + dr) | 0 + this._b = (this._c + dl + er) | 0 + this._c = (this._d + el + ar) | 0 + this._d = (this._e + al + br) | 0 + this._e = (this._a + bl + cr) | 0 + this._a = t } -},{}],"CO0D":[function(require,module,exports) { -'use strict'; +RIPEMD160.prototype._digest = function () { + // create padding and handle blocks + this._block[this._blockOffset++] = 0x80 + if (this._blockOffset > 56) { + this._block.fill(0, this._blockOffset, 64) + this._update() + this._blockOffset = 0 + } -var utils = require('../utils'); -var BN = require('bn.js'); -var inherits = require('inherits'); -var Base = require('./base'); + this._block.fill(0, this._blockOffset, 56) + this._block.writeUInt32LE(this._length[0], 56) + this._block.writeUInt32LE(this._length[1], 60) + this._update() -var assert = utils.assert; + // produce result + var buffer = Buffer.alloc ? Buffer.alloc(20) : new Buffer(20) + buffer.writeInt32LE(this._a, 0) + buffer.writeInt32LE(this._b, 4) + buffer.writeInt32LE(this._c, 8) + buffer.writeInt32LE(this._d, 12) + buffer.writeInt32LE(this._e, 16) + return buffer +} -function ShortCurve(conf) { - Base.call(this, 'short', conf); +function rotl (x, n) { + return (x << n) | (x >>> (32 - n)) +} - this.a = new BN(conf.a, 16).toRed(this.red); - this.b = new BN(conf.b, 16).toRed(this.red); - this.tinv = this.two.redInvm(); +function fn1 (a, b, c, d, e, m, k, s) { + return (rotl((a + (b ^ c ^ d) + m + k) | 0, s) + e) | 0 +} - this.zeroA = this.a.fromRed().cmpn(0) === 0; - this.threeA = this.a.fromRed().sub(this.p).cmpn(-3) === 0; +function fn2 (a, b, c, d, e, m, k, s) { + return (rotl((a + ((b & c) | ((~b) & d)) + m + k) | 0, s) + e) | 0 +} - // If the curve is endomorphic, precalculate beta and lambda - this.endo = this._getEndomorphism(conf); - this._endoWnafT1 = new Array(4); - this._endoWnafT2 = new Array(4); +function fn3 (a, b, c, d, e, m, k, s) { + return (rotl((a + ((b | (~c)) ^ d) + m + k) | 0, s) + e) | 0 } -inherits(ShortCurve, Base); -module.exports = ShortCurve; -ShortCurve.prototype._getEndomorphism = function _getEndomorphism(conf) { - // No efficient endomorphism - if (!this.zeroA || !this.g || !this.n || this.p.modn(3) !== 1) - return; +function fn4 (a, b, c, d, e, m, k, s) { + return (rotl((a + ((b & d) | (c & (~d))) + m + k) | 0, s) + e) | 0 +} - // Compute beta and lambda, that lambda * P = (beta * Px; Py) - var beta; - var lambda; - if (conf.beta) { - beta = new BN(conf.beta, 16).toRed(this.red); - } else { - var betas = this._getEndoRoots(this.p); - // Choose the smallest beta - beta = betas[0].cmp(betas[1]) < 0 ? betas[0] : betas[1]; - beta = beta.toRed(this.red); - } - if (conf.lambda) { - lambda = new BN(conf.lambda, 16); - } else { - // Choose the lambda that is matching selected beta - var lambdas = this._getEndoRoots(this.n); - if (this.g.mul(lambdas[0]).x.cmp(this.g.x.redMul(beta)) === 0) { - lambda = lambdas[0]; - } else { - lambda = lambdas[1]; - assert(this.g.mul(lambda).x.cmp(this.g.x.redMul(beta)) === 0); - } - } +function fn5 (a, b, c, d, e, m, k, s) { + return (rotl((a + (b ^ (c | (~d))) + m + k) | 0, s) + e) | 0 +} - // Get basis vectors, used for balanced length-two representation - var basis; - if (conf.basis) { - basis = conf.basis.map(function(vec) { - return { - a: new BN(vec.a, 16), - b: new BN(vec.b, 16) - }; - }); - } else { - basis = this._getEndoBasis(lambda); - } +module.exports = RIPEMD160 - return { - beta: beta, - lambda: lambda, - basis: basis - }; -}; +},{"buffer":"dskh","inherits":"Bm0n","hash-base":"UcQW"}],"VHby":[function(require,module,exports) { -ShortCurve.prototype._getEndoRoots = function _getEndoRoots(num) { - // Find roots of for x^2 + x + 1 in F - // Root = (-1 +- Sqrt(-3)) / 2 - // - var red = num === this.p ? this.red : BN.mont(num); - var tinv = new BN(2).toRed(red).redInvm(); - var ntinv = tinv.redNeg(); +var Buffer = require('safe-buffer').Buffer - var s = new BN(3).toRed(red).redNeg().redSqrt().redMul(tinv); +// prototype class for hash functions +function Hash (blockSize, finalSize) { + this._block = Buffer.alloc(blockSize) + this._finalSize = finalSize + this._blockSize = blockSize + this._len = 0 +} - var l1 = ntinv.redAdd(s).fromRed(); - var l2 = ntinv.redSub(s).fromRed(); - return [ l1, l2 ]; -}; +Hash.prototype.update = function (data, enc) { + if (typeof data === 'string') { + enc = enc || 'utf8' + data = Buffer.from(data, enc) + } -ShortCurve.prototype._getEndoBasis = function _getEndoBasis(lambda) { - // aprxSqrt >= sqrt(this.n) - var aprxSqrt = this.n.ushrn(Math.floor(this.n.bitLength() / 2)); + var block = this._block + var blockSize = this._blockSize + var length = data.length + var accum = this._len - // 3.74 - // Run EGCD, until r(L + 1) < aprxSqrt - var u = lambda; - var v = this.n.clone(); - var x1 = new BN(1); - var y1 = new BN(0); - var x2 = new BN(0); - var y2 = new BN(1); + for (var offset = 0; offset < length;) { + var assigned = accum % blockSize + var remainder = Math.min(length - offset, blockSize - assigned) - // NOTE: all vectors are roots of: a + b * lambda = 0 (mod n) - var a0; - var b0; - // First vector - var a1; - var b1; - // Second vector - var a2; - var b2; + for (var i = 0; i < remainder; i++) { + block[assigned + i] = data[offset + i] + } - var prevR; - var i = 0; - var r; - var x; - while (u.cmpn(0) !== 0) { - var q = v.div(u); - r = v.sub(q.mul(u)); - x = x2.sub(q.mul(x1)); - var y = y2.sub(q.mul(y1)); + accum += remainder + offset += remainder - if (!a1 && r.cmp(aprxSqrt) < 0) { - a0 = prevR.neg(); - b0 = x1; - a1 = r.neg(); - b1 = x; - } else if (a1 && ++i === 2) { - break; + if ((accum % blockSize) === 0) { + this._update(block) } - prevR = r; - - v = u; - u = r; - x2 = x1; - x1 = x; - y2 = y1; - y1 = y; } - a2 = r.neg(); - b2 = x; - var len1 = a1.sqr().add(b1.sqr()); - var len2 = a2.sqr().add(b2.sqr()); - if (len2.cmp(len1) >= 0) { - a2 = a0; - b2 = b0; - } + this._len += length + return this +} - // Normalize signs - if (a1.negative) { - a1 = a1.neg(); - b1 = b1.neg(); - } - if (a2.negative) { - a2 = a2.neg(); - b2 = b2.neg(); - } +Hash.prototype.digest = function (enc) { + var rem = this._len % this._blockSize - return [ - { a: a1, b: b1 }, - { a: a2, b: b2 } - ]; -}; + this._block[rem] = 0x80 -ShortCurve.prototype._endoSplit = function _endoSplit(k) { - var basis = this.endo.basis; - var v1 = basis[0]; - var v2 = basis[1]; + // zero (rem + 1) trailing bits, where (rem + 1) is the smallest + // non-negative solution to the equation (length + 1 + (rem + 1)) === finalSize mod blockSize + this._block.fill(0, rem + 1) - var c1 = v2.b.mul(k).divRound(this.n); - var c2 = v1.b.neg().mul(k).divRound(this.n); + if (rem >= this._finalSize) { + this._update(this._block) + this._block.fill(0) + } - var p1 = c1.mul(v1.a); - var p2 = c2.mul(v2.a); - var q1 = c1.mul(v1.b); - var q2 = c2.mul(v2.b); + var bits = this._len * 8 - // Calculate answer - var k1 = k.sub(p1).sub(p2); - var k2 = q1.add(q2).neg(); - return { k1: k1, k2: k2 }; -}; + // uint32 + if (bits <= 0xffffffff) { + this._block.writeUInt32BE(bits, this._blockSize - 4) -ShortCurve.prototype.pointFromX = function pointFromX(x, odd) { - x = new BN(x, 16); - if (!x.red) - x = x.toRed(this.red); + // uint64 + } else { + var lowBits = (bits & 0xffffffff) >>> 0 + var highBits = (bits - lowBits) / 0x100000000 - var y2 = x.redSqr().redMul(x).redIAdd(x.redMul(this.a)).redIAdd(this.b); - var y = y2.redSqrt(); - if (y.redSqr().redSub(y2).cmp(this.zero) !== 0) - throw new Error('invalid point'); + this._block.writeUInt32BE(highBits, this._blockSize - 8) + this._block.writeUInt32BE(lowBits, this._blockSize - 4) + } - // XXX Is there any way to tell if the number is odd without converting it - // to non-red form? - var isOdd = y.fromRed().isOdd(); - if (odd && !isOdd || !odd && isOdd) - y = y.redNeg(); + this._update(this._block) + var hash = this._hash() - return this.point(x, y); -}; + return enc ? hash.toString(enc) : hash +} -ShortCurve.prototype.validate = function validate(point) { - if (point.inf) - return true; +Hash.prototype._update = function () { + throw new Error('_update must be implemented by subclass') +} - var x = point.x; - var y = point.y; +module.exports = Hash - var ax = this.a.redMul(x); - var rhs = x.redSqr().redMul(x).redIAdd(ax).redIAdd(this.b); - return y.redSqr().redISub(rhs).cmpn(0) === 0; -}; +},{"safe-buffer":"Wugr"}],"j9dE":[function(require,module,exports) { -ShortCurve.prototype._endoWnafMulAdd = - function _endoWnafMulAdd(points, coeffs, jacobianResult) { - var npoints = this._endoWnafT1; - var ncoeffs = this._endoWnafT2; - for (var i = 0; i < points.length; i++) { - var split = this._endoSplit(coeffs[i]); - var p = points[i]; - var beta = p._getBeta(); +/* + * A JavaScript implementation of the Secure Hash Algorithm, SHA-0, as defined + * in FIPS PUB 180-1 + * This source code is derived from sha1.js of the same repository. + * The difference between SHA-0 and SHA-1 is just a bitwise rotate left + * operation was added. + */ - if (split.k1.negative) { - split.k1.ineg(); - p = p.neg(true); - } - if (split.k2.negative) { - split.k2.ineg(); - beta = beta.neg(true); - } +var inherits = require('inherits') +var Hash = require('./hash') +var Buffer = require('safe-buffer').Buffer - npoints[i * 2] = p; - npoints[i * 2 + 1] = beta; - ncoeffs[i * 2] = split.k1; - ncoeffs[i * 2 + 1] = split.k2; - } - var res = this._wnafMulAdd(1, npoints, ncoeffs, i * 2, jacobianResult); +var K = [ + 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc | 0, 0xca62c1d6 | 0 +] - // Clean-up references to points and coefficients - for (var j = 0; j < i * 2; j++) { - npoints[j] = null; - ncoeffs[j] = null; - } - return res; -}; +var W = new Array(80) -function Point(curve, x, y, isRed) { - Base.BasePoint.call(this, curve, 'affine'); - if (x === null && y === null) { - this.x = null; - this.y = null; - this.inf = true; - } else { - this.x = new BN(x, 16); - this.y = new BN(y, 16); - // Force redgomery representation when loading from JSON - if (isRed) { - this.x.forceRed(this.curve.red); - this.y.forceRed(this.curve.red); - } - if (!this.x.red) - this.x = this.x.toRed(this.curve.red); - if (!this.y.red) - this.y = this.y.toRed(this.curve.red); - this.inf = false; - } +function Sha () { + this.init() + this._w = W + + Hash.call(this, 64, 56) } -inherits(Point, Base.BasePoint); -ShortCurve.prototype.point = function point(x, y, isRed) { - return new Point(this, x, y, isRed); -}; +inherits(Sha, Hash) -ShortCurve.prototype.pointFromJSON = function pointFromJSON(obj, red) { - return Point.fromJSON(this, obj, red); -}; +Sha.prototype.init = function () { + this._a = 0x67452301 + this._b = 0xefcdab89 + this._c = 0x98badcfe + this._d = 0x10325476 + this._e = 0xc3d2e1f0 -Point.prototype._getBeta = function _getBeta() { - if (!this.curve.endo) - return; + return this +} - var pre = this.precomputed; - if (pre && pre.beta) - return pre.beta; +function rotl5 (num) { + return (num << 5) | (num >>> 27) +} - var beta = this.curve.point(this.x.redMul(this.curve.endo.beta), this.y); - if (pre) { - var curve = this.curve; - var endoMul = function(p) { - return curve.point(p.x.redMul(curve.endo.beta), p.y); - }; - pre.beta = beta; - beta.precomputed = { - beta: null, - naf: pre.naf && { - wnd: pre.naf.wnd, - points: pre.naf.points.map(endoMul) - }, - doubles: pre.doubles && { - step: pre.doubles.step, - points: pre.doubles.points.map(endoMul) - } - }; - } - return beta; -}; +function rotl30 (num) { + return (num << 30) | (num >>> 2) +} -Point.prototype.toJSON = function toJSON() { - if (!this.precomputed) - return [ this.x, this.y ]; +function ft (s, b, c, d) { + if (s === 0) return (b & c) | ((~b) & d) + if (s === 2) return (b & c) | (b & d) | (c & d) + return b ^ c ^ d +} - return [ this.x, this.y, this.precomputed && { - doubles: this.precomputed.doubles && { - step: this.precomputed.doubles.step, - points: this.precomputed.doubles.points.slice(1) - }, - naf: this.precomputed.naf && { - wnd: this.precomputed.naf.wnd, - points: this.precomputed.naf.points.slice(1) - } - } ]; -}; +Sha.prototype._update = function (M) { + var W = this._w -Point.fromJSON = function fromJSON(curve, obj, red) { - if (typeof obj === 'string') - obj = JSON.parse(obj); - var res = curve.point(obj[0], obj[1], red); - if (!obj[2]) - return res; + var a = this._a | 0 + var b = this._b | 0 + var c = this._c | 0 + var d = this._d | 0 + var e = this._e | 0 - function obj2point(obj) { - return curve.point(obj[0], obj[1], red); - } + for (var i = 0; i < 16; ++i) W[i] = M.readInt32BE(i * 4) + for (; i < 80; ++i) W[i] = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16] - var pre = obj[2]; - res.precomputed = { - beta: null, - doubles: pre.doubles && { - step: pre.doubles.step, - points: [ res ].concat(pre.doubles.points.map(obj2point)) - }, - naf: pre.naf && { - wnd: pre.naf.wnd, - points: [ res ].concat(pre.naf.points.map(obj2point)) - } - }; - return res; -}; + for (var j = 0; j < 80; ++j) { + var s = ~~(j / 20) + var t = (rotl5(a) + ft(s, b, c, d) + e + W[j] + K[s]) | 0 -Point.prototype.inspect = function inspect() { - if (this.isInfinity()) - return ''; - return ''; -}; + e = d + d = c + c = rotl30(b) + b = a + a = t + } -Point.prototype.isInfinity = function isInfinity() { - return this.inf; -}; + this._a = (a + this._a) | 0 + this._b = (b + this._b) | 0 + this._c = (c + this._c) | 0 + this._d = (d + this._d) | 0 + this._e = (e + this._e) | 0 +} -Point.prototype.add = function add(p) { - // O + P = P - if (this.inf) - return p; +Sha.prototype._hash = function () { + var H = Buffer.allocUnsafe(20) - // P + O = P - if (p.inf) - return this; + H.writeInt32BE(this._a | 0, 0) + H.writeInt32BE(this._b | 0, 4) + H.writeInt32BE(this._c | 0, 8) + H.writeInt32BE(this._d | 0, 12) + H.writeInt32BE(this._e | 0, 16) - // P + P = 2P - if (this.eq(p)) - return this.dbl(); + return H +} - // P + (-P) = O - if (this.neg().eq(p)) - return this.curve.point(null, null); +module.exports = Sha - // P + Q = O - if (this.x.cmp(p.x) === 0) - return this.curve.point(null, null); +},{"inherits":"Bm0n","./hash":"VHby","safe-buffer":"Wugr"}],"oPH4":[function(require,module,exports) { - var c = this.y.redSub(p.y); - if (c.cmpn(0) !== 0) - c = c.redMul(this.x.redSub(p.x).redInvm()); - var nx = c.redSqr().redISub(this.x).redISub(p.x); - var ny = c.redMul(this.x.redSub(nx)).redISub(this.y); - return this.curve.point(nx, ny); -}; +/* + * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined + * in FIPS PUB 180-1 + * Version 2.1a Copyright Paul Johnston 2000 - 2002. + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * Distributed under the BSD License + * See http://pajhome.org.uk/crypt/md5 for details. + */ -Point.prototype.dbl = function dbl() { - if (this.inf) - return this; +var inherits = require('inherits') +var Hash = require('./hash') +var Buffer = require('safe-buffer').Buffer - // 2P = O - var ys1 = this.y.redAdd(this.y); - if (ys1.cmpn(0) === 0) - return this.curve.point(null, null); +var K = [ + 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc | 0, 0xca62c1d6 | 0 +] - var a = this.curve.a; +var W = new Array(80) - var x2 = this.x.redSqr(); - var dyinv = ys1.redInvm(); - var c = x2.redAdd(x2).redIAdd(x2).redIAdd(a).redMul(dyinv); +function Sha1 () { + this.init() + this._w = W - var nx = c.redSqr().redISub(this.x.redAdd(this.x)); - var ny = c.redMul(this.x.redSub(nx)).redISub(this.y); - return this.curve.point(nx, ny); -}; + Hash.call(this, 64, 56) +} -Point.prototype.getX = function getX() { - return this.x.fromRed(); -}; +inherits(Sha1, Hash) -Point.prototype.getY = function getY() { - return this.y.fromRed(); -}; +Sha1.prototype.init = function () { + this._a = 0x67452301 + this._b = 0xefcdab89 + this._c = 0x98badcfe + this._d = 0x10325476 + this._e = 0xc3d2e1f0 -Point.prototype.mul = function mul(k) { - k = new BN(k, 16); + return this +} - if (this._hasDoubles(k)) - return this.curve._fixedNafMul(this, k); - else if (this.curve.endo) - return this.curve._endoWnafMulAdd([ this ], [ k ]); - else - return this.curve._wnafMul(this, k); -}; +function rotl1 (num) { + return (num << 1) | (num >>> 31) +} -Point.prototype.mulAdd = function mulAdd(k1, p2, k2) { - var points = [ this, p2 ]; - var coeffs = [ k1, k2 ]; - if (this.curve.endo) - return this.curve._endoWnafMulAdd(points, coeffs); - else - return this.curve._wnafMulAdd(1, points, coeffs, 2); -}; +function rotl5 (num) { + return (num << 5) | (num >>> 27) +} -Point.prototype.jmulAdd = function jmulAdd(k1, p2, k2) { - var points = [ this, p2 ]; - var coeffs = [ k1, k2 ]; - if (this.curve.endo) - return this.curve._endoWnafMulAdd(points, coeffs, true); - else - return this.curve._wnafMulAdd(1, points, coeffs, 2, true); -}; +function rotl30 (num) { + return (num << 30) | (num >>> 2) +} -Point.prototype.eq = function eq(p) { - return this === p || - this.inf === p.inf && - (this.inf || this.x.cmp(p.x) === 0 && this.y.cmp(p.y) === 0); -}; +function ft (s, b, c, d) { + if (s === 0) return (b & c) | ((~b) & d) + if (s === 2) return (b & c) | (b & d) | (c & d) + return b ^ c ^ d +} -Point.prototype.neg = function neg(_precompute) { - if (this.inf) - return this; +Sha1.prototype._update = function (M) { + var W = this._w - var res = this.curve.point(this.x, this.y.redNeg()); - if (_precompute && this.precomputed) { - var pre = this.precomputed; - var negate = function(p) { - return p.neg(); - }; - res.precomputed = { - naf: pre.naf && { - wnd: pre.naf.wnd, - points: pre.naf.points.map(negate) - }, - doubles: pre.doubles && { - step: pre.doubles.step, - points: pre.doubles.points.map(negate) - } - }; - } - return res; -}; + var a = this._a | 0 + var b = this._b | 0 + var c = this._c | 0 + var d = this._d | 0 + var e = this._e | 0 -Point.prototype.toJ = function toJ() { - if (this.inf) - return this.curve.jpoint(null, null, null); + for (var i = 0; i < 16; ++i) W[i] = M.readInt32BE(i * 4) + for (; i < 80; ++i) W[i] = rotl1(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]) - var res = this.curve.jpoint(this.x, this.y, this.curve.one); - return res; -}; + for (var j = 0; j < 80; ++j) { + var s = ~~(j / 20) + var t = (rotl5(a) + ft(s, b, c, d) + e + W[j] + K[s]) | 0 -function JPoint(curve, x, y, z) { - Base.BasePoint.call(this, curve, 'jacobian'); - if (x === null && y === null && z === null) { - this.x = this.curve.one; - this.y = this.curve.one; - this.z = new BN(0); - } else { - this.x = new BN(x, 16); - this.y = new BN(y, 16); - this.z = new BN(z, 16); + e = d + d = c + c = rotl30(b) + b = a + a = t } - if (!this.x.red) - this.x = this.x.toRed(this.curve.red); - if (!this.y.red) - this.y = this.y.toRed(this.curve.red); - if (!this.z.red) - this.z = this.z.toRed(this.curve.red); - this.zOne = this.z === this.curve.one; + this._a = (a + this._a) | 0 + this._b = (b + this._b) | 0 + this._c = (c + this._c) | 0 + this._d = (d + this._d) | 0 + this._e = (e + this._e) | 0 } -inherits(JPoint, Base.BasePoint); -ShortCurve.prototype.jpoint = function jpoint(x, y, z) { - return new JPoint(this, x, y, z); -}; +Sha1.prototype._hash = function () { + var H = Buffer.allocUnsafe(20) -JPoint.prototype.toP = function toP() { - if (this.isInfinity()) - return this.curve.point(null, null); + H.writeInt32BE(this._a | 0, 0) + H.writeInt32BE(this._b | 0, 4) + H.writeInt32BE(this._c | 0, 8) + H.writeInt32BE(this._d | 0, 12) + H.writeInt32BE(this._e | 0, 16) - var zinv = this.z.redInvm(); - var zinv2 = zinv.redSqr(); - var ax = this.x.redMul(zinv2); - var ay = this.y.redMul(zinv2).redMul(zinv); + return H +} - return this.curve.point(ax, ay); -}; +module.exports = Sha1 -JPoint.prototype.neg = function neg() { - return this.curve.jpoint(this.x, this.y.redNeg(), this.z); -}; +},{"inherits":"Bm0n","./hash":"VHby","safe-buffer":"Wugr"}],"IUSb":[function(require,module,exports) { -JPoint.prototype.add = function add(p) { - // O + P = P - if (this.isInfinity()) - return p; +/** + * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined + * in FIPS 180-2 + * Version 2.2-beta Copyright Angel Marin, Paul Johnston 2000 - 2009. + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * + */ - // P + O = P - if (p.isInfinity()) - return this; +var inherits = require('inherits') +var Hash = require('./hash') +var Buffer = require('safe-buffer').Buffer - // 12M + 4S + 7A - var pz2 = p.z.redSqr(); - var z2 = this.z.redSqr(); - var u1 = this.x.redMul(pz2); - var u2 = p.x.redMul(z2); - var s1 = this.y.redMul(pz2.redMul(p.z)); - var s2 = p.y.redMul(z2.redMul(this.z)); +var K = [ + 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, + 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, + 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, + 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, + 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, + 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, + 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, + 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967, + 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, + 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, + 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, + 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, + 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, + 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, + 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, + 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2 +] - var h = u1.redSub(u2); - var r = s1.redSub(s2); - if (h.cmpn(0) === 0) { - if (r.cmpn(0) !== 0) - return this.curve.jpoint(null, null, null); - else - return this.dbl(); - } +var W = new Array(64) - var h2 = h.redSqr(); - var h3 = h2.redMul(h); - var v = u1.redMul(h2); +function Sha256 () { + this.init() - var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v); - var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3)); - var nz = this.z.redMul(p.z).redMul(h); + this._w = W // new Array(64) - return this.curve.jpoint(nx, ny, nz); -}; + Hash.call(this, 64, 56) +} -JPoint.prototype.mixedAdd = function mixedAdd(p) { - // O + P = P - if (this.isInfinity()) - return p.toJ(); +inherits(Sha256, Hash) - // P + O = P - if (p.isInfinity()) - return this; +Sha256.prototype.init = function () { + this._a = 0x6a09e667 + this._b = 0xbb67ae85 + this._c = 0x3c6ef372 + this._d = 0xa54ff53a + this._e = 0x510e527f + this._f = 0x9b05688c + this._g = 0x1f83d9ab + this._h = 0x5be0cd19 - // 8M + 3S + 7A - var z2 = this.z.redSqr(); - var u1 = this.x; - var u2 = p.x.redMul(z2); - var s1 = this.y; - var s2 = p.y.redMul(z2).redMul(this.z); + return this +} - var h = u1.redSub(u2); - var r = s1.redSub(s2); - if (h.cmpn(0) === 0) { - if (r.cmpn(0) !== 0) - return this.curve.jpoint(null, null, null); - else - return this.dbl(); - } +function ch (x, y, z) { + return z ^ (x & (y ^ z)) +} - var h2 = h.redSqr(); - var h3 = h2.redMul(h); - var v = u1.redMul(h2); +function maj (x, y, z) { + return (x & y) | (z & (x | y)) +} - var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v); - var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3)); - var nz = this.z.redMul(h); +function sigma0 (x) { + return (x >>> 2 | x << 30) ^ (x >>> 13 | x << 19) ^ (x >>> 22 | x << 10) +} - return this.curve.jpoint(nx, ny, nz); -}; +function sigma1 (x) { + return (x >>> 6 | x << 26) ^ (x >>> 11 | x << 21) ^ (x >>> 25 | x << 7) +} -JPoint.prototype.dblp = function dblp(pow) { - if (pow === 0) - return this; - if (this.isInfinity()) - return this; - if (!pow) - return this.dbl(); +function gamma0 (x) { + return (x >>> 7 | x << 25) ^ (x >>> 18 | x << 14) ^ (x >>> 3) +} - if (this.curve.zeroA || this.curve.threeA) { - var r = this; - for (var i = 0; i < pow; i++) - r = r.dbl(); - return r; - } +function gamma1 (x) { + return (x >>> 17 | x << 15) ^ (x >>> 19 | x << 13) ^ (x >>> 10) +} - // 1M + 2S + 1A + N * (4S + 5M + 8A) - // N = 1 => 6M + 6S + 9A - var a = this.curve.a; - var tinv = this.curve.tinv; +Sha256.prototype._update = function (M) { + var W = this._w - var jx = this.x; - var jy = this.y; - var jz = this.z; - var jz4 = jz.redSqr().redSqr(); + var a = this._a | 0 + var b = this._b | 0 + var c = this._c | 0 + var d = this._d | 0 + var e = this._e | 0 + var f = this._f | 0 + var g = this._g | 0 + var h = this._h | 0 - // Reuse results - var jyd = jy.redAdd(jy); - for (var i = 0; i < pow; i++) { - var jx2 = jx.redSqr(); - var jyd2 = jyd.redSqr(); - var jyd4 = jyd2.redSqr(); - var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4)); + for (var i = 0; i < 16; ++i) W[i] = M.readInt32BE(i * 4) + for (; i < 64; ++i) W[i] = (gamma1(W[i - 2]) + W[i - 7] + gamma0(W[i - 15]) + W[i - 16]) | 0 - var t1 = jx.redMul(jyd2); - var nx = c.redSqr().redISub(t1.redAdd(t1)); - var t2 = t1.redISub(nx); - var dny = c.redMul(t2); - dny = dny.redIAdd(dny).redISub(jyd4); - var nz = jyd.redMul(jz); - if (i + 1 < pow) - jz4 = jz4.redMul(jyd4); + for (var j = 0; j < 64; ++j) { + var T1 = (h + sigma1(e) + ch(e, f, g) + K[j] + W[j]) | 0 + var T2 = (sigma0(a) + maj(a, b, c)) | 0 - jx = nx; - jz = nz; - jyd = dny; + h = g + g = f + f = e + e = (d + T1) | 0 + d = c + c = b + b = a + a = (T1 + T2) | 0 } - return this.curve.jpoint(jx, jyd.redMul(tinv), jz); -}; - -JPoint.prototype.dbl = function dbl() { - if (this.isInfinity()) - return this; - - if (this.curve.zeroA) - return this._zeroDbl(); - else if (this.curve.threeA) - return this._threeDbl(); - else - return this._dbl(); -}; - -JPoint.prototype._zeroDbl = function _zeroDbl() { - var nx; - var ny; - var nz; - // Z = 1 - if (this.zOne) { - // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html - // #doubling-mdbl-2007-bl - // 1M + 5S + 14A - - // XX = X1^2 - var xx = this.x.redSqr(); - // YY = Y1^2 - var yy = this.y.redSqr(); - // YYYY = YY^2 - var yyyy = yy.redSqr(); - // S = 2 * ((X1 + YY)^2 - XX - YYYY) - var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy); - s = s.redIAdd(s); - // M = 3 * XX + a; a = 0 - var m = xx.redAdd(xx).redIAdd(xx); - // T = M ^ 2 - 2*S - var t = m.redSqr().redISub(s).redISub(s); + this._a = (a + this._a) | 0 + this._b = (b + this._b) | 0 + this._c = (c + this._c) | 0 + this._d = (d + this._d) | 0 + this._e = (e + this._e) | 0 + this._f = (f + this._f) | 0 + this._g = (g + this._g) | 0 + this._h = (h + this._h) | 0 +} - // 8 * YYYY - var yyyy8 = yyyy.redIAdd(yyyy); - yyyy8 = yyyy8.redIAdd(yyyy8); - yyyy8 = yyyy8.redIAdd(yyyy8); +Sha256.prototype._hash = function () { + var H = Buffer.allocUnsafe(32) - // X3 = T - nx = t; - // Y3 = M * (S - T) - 8 * YYYY - ny = m.redMul(s.redISub(t)).redISub(yyyy8); - // Z3 = 2*Y1 - nz = this.y.redAdd(this.y); - } else { - // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html - // #doubling-dbl-2009-l - // 2M + 5S + 13A + H.writeInt32BE(this._a, 0) + H.writeInt32BE(this._b, 4) + H.writeInt32BE(this._c, 8) + H.writeInt32BE(this._d, 12) + H.writeInt32BE(this._e, 16) + H.writeInt32BE(this._f, 20) + H.writeInt32BE(this._g, 24) + H.writeInt32BE(this._h, 28) - // A = X1^2 - var a = this.x.redSqr(); - // B = Y1^2 - var b = this.y.redSqr(); - // C = B^2 - var c = b.redSqr(); - // D = 2 * ((X1 + B)^2 - A - C) - var d = this.x.redAdd(b).redSqr().redISub(a).redISub(c); - d = d.redIAdd(d); - // E = 3 * A - var e = a.redAdd(a).redIAdd(a); - // F = E^2 - var f = e.redSqr(); + return H +} - // 8 * C - var c8 = c.redIAdd(c); - c8 = c8.redIAdd(c8); - c8 = c8.redIAdd(c8); +module.exports = Sha256 - // X3 = F - 2 * D - nx = f.redISub(d).redISub(d); - // Y3 = E * (D - X3) - 8 * C - ny = e.redMul(d.redISub(nx)).redISub(c8); - // Z3 = 2 * Y1 * Z1 - nz = this.y.redMul(this.z); - nz = nz.redIAdd(nz); - } +},{"inherits":"Bm0n","./hash":"VHby","safe-buffer":"Wugr"}],"MeLE":[function(require,module,exports) { - return this.curve.jpoint(nx, ny, nz); -}; +/** + * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined + * in FIPS 180-2 + * Version 2.2-beta Copyright Angel Marin, Paul Johnston 2000 - 2009. + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * + */ -JPoint.prototype._threeDbl = function _threeDbl() { - var nx; - var ny; - var nz; - // Z = 1 - if (this.zOne) { - // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html - // #doubling-mdbl-2007-bl - // 1M + 5S + 15A +var inherits = require('inherits') +var Sha256 = require('./sha256') +var Hash = require('./hash') +var Buffer = require('safe-buffer').Buffer - // XX = X1^2 - var xx = this.x.redSqr(); - // YY = Y1^2 - var yy = this.y.redSqr(); - // YYYY = YY^2 - var yyyy = yy.redSqr(); - // S = 2 * ((X1 + YY)^2 - XX - YYYY) - var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy); - s = s.redIAdd(s); - // M = 3 * XX + a - var m = xx.redAdd(xx).redIAdd(xx).redIAdd(this.curve.a); - // T = M^2 - 2 * S - var t = m.redSqr().redISub(s).redISub(s); - // X3 = T - nx = t; - // Y3 = M * (S - T) - 8 * YYYY - var yyyy8 = yyyy.redIAdd(yyyy); - yyyy8 = yyyy8.redIAdd(yyyy8); - yyyy8 = yyyy8.redIAdd(yyyy8); - ny = m.redMul(s.redISub(t)).redISub(yyyy8); - // Z3 = 2 * Y1 - nz = this.y.redAdd(this.y); - } else { - // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-2001-b - // 3M + 5S +var W = new Array(64) - // delta = Z1^2 - var delta = this.z.redSqr(); - // gamma = Y1^2 - var gamma = this.y.redSqr(); - // beta = X1 * gamma - var beta = this.x.redMul(gamma); - // alpha = 3 * (X1 - delta) * (X1 + delta) - var alpha = this.x.redSub(delta).redMul(this.x.redAdd(delta)); - alpha = alpha.redAdd(alpha).redIAdd(alpha); - // X3 = alpha^2 - 8 * beta - var beta4 = beta.redIAdd(beta); - beta4 = beta4.redIAdd(beta4); - var beta8 = beta4.redAdd(beta4); - nx = alpha.redSqr().redISub(beta8); - // Z3 = (Y1 + Z1)^2 - gamma - delta - nz = this.y.redAdd(this.z).redSqr().redISub(gamma).redISub(delta); - // Y3 = alpha * (4 * beta - X3) - 8 * gamma^2 - var ggamma8 = gamma.redSqr(); - ggamma8 = ggamma8.redIAdd(ggamma8); - ggamma8 = ggamma8.redIAdd(ggamma8); - ggamma8 = ggamma8.redIAdd(ggamma8); - ny = alpha.redMul(beta4.redISub(nx)).redISub(ggamma8); - } +function Sha224 () { + this.init() - return this.curve.jpoint(nx, ny, nz); -}; + this._w = W // new Array(64) -JPoint.prototype._dbl = function _dbl() { - var a = this.curve.a; + Hash.call(this, 64, 56) +} - // 4M + 6S + 10A - var jx = this.x; - var jy = this.y; - var jz = this.z; - var jz4 = jz.redSqr().redSqr(); +inherits(Sha224, Sha256) - var jx2 = jx.redSqr(); - var jy2 = jy.redSqr(); +Sha224.prototype.init = function () { + this._a = 0xc1059ed8 + this._b = 0x367cd507 + this._c = 0x3070dd17 + this._d = 0xf70e5939 + this._e = 0xffc00b31 + this._f = 0x68581511 + this._g = 0x64f98fa7 + this._h = 0xbefa4fa4 - var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4)); + return this +} - var jxd4 = jx.redAdd(jx); - jxd4 = jxd4.redIAdd(jxd4); - var t1 = jxd4.redMul(jy2); - var nx = c.redSqr().redISub(t1.redAdd(t1)); - var t2 = t1.redISub(nx); +Sha224.prototype._hash = function () { + var H = Buffer.allocUnsafe(28) - var jyd8 = jy2.redSqr(); - jyd8 = jyd8.redIAdd(jyd8); - jyd8 = jyd8.redIAdd(jyd8); - jyd8 = jyd8.redIAdd(jyd8); - var ny = c.redMul(t2).redISub(jyd8); - var nz = jy.redAdd(jy).redMul(jz); + H.writeInt32BE(this._a, 0) + H.writeInt32BE(this._b, 4) + H.writeInt32BE(this._c, 8) + H.writeInt32BE(this._d, 12) + H.writeInt32BE(this._e, 16) + H.writeInt32BE(this._f, 20) + H.writeInt32BE(this._g, 24) - return this.curve.jpoint(nx, ny, nz); -}; + return H +} -JPoint.prototype.trpl = function trpl() { - if (!this.curve.zeroA) - return this.dbl().add(this); +module.exports = Sha224 - // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#tripling-tpl-2007-bl - // 5M + 10S + ... +},{"inherits":"Bm0n","./sha256":"IUSb","./hash":"VHby","safe-buffer":"Wugr"}],"sILY":[function(require,module,exports) { - // XX = X1^2 - var xx = this.x.redSqr(); - // YY = Y1^2 - var yy = this.y.redSqr(); - // ZZ = Z1^2 - var zz = this.z.redSqr(); - // YYYY = YY^2 - var yyyy = yy.redSqr(); - // M = 3 * XX + a * ZZ2; a = 0 - var m = xx.redAdd(xx).redIAdd(xx); - // MM = M^2 - var mm = m.redSqr(); - // E = 6 * ((X1 + YY)^2 - XX - YYYY) - MM - var e = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy); - e = e.redIAdd(e); - e = e.redAdd(e).redIAdd(e); - e = e.redISub(mm); - // EE = E^2 - var ee = e.redSqr(); - // T = 16*YYYY - var t = yyyy.redIAdd(yyyy); - t = t.redIAdd(t); - t = t.redIAdd(t); - t = t.redIAdd(t); - // U = (M + E)^2 - MM - EE - T - var u = m.redIAdd(e).redSqr().redISub(mm).redISub(ee).redISub(t); - // X3 = 4 * (X1 * EE - 4 * YY * U) - var yyu4 = yy.redMul(u); - yyu4 = yyu4.redIAdd(yyu4); - yyu4 = yyu4.redIAdd(yyu4); - var nx = this.x.redMul(ee).redISub(yyu4); - nx = nx.redIAdd(nx); - nx = nx.redIAdd(nx); - // Y3 = 8 * Y1 * (U * (T - U) - E * EE) - var ny = this.y.redMul(u.redMul(t.redISub(u)).redISub(e.redMul(ee))); - ny = ny.redIAdd(ny); - ny = ny.redIAdd(ny); - ny = ny.redIAdd(ny); - // Z3 = (Z1 + E)^2 - ZZ - EE - var nz = this.z.redAdd(e).redSqr().redISub(zz).redISub(ee); +var inherits = require('inherits') +var Hash = require('./hash') +var Buffer = require('safe-buffer').Buffer - return this.curve.jpoint(nx, ny, nz); -}; +var K = [ + 0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd, + 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc, + 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019, + 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118, + 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe, + 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2, + 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1, + 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694, + 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3, + 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65, + 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483, + 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5, + 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210, + 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4, + 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725, + 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70, + 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926, + 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df, + 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8, + 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b, + 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001, + 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30, + 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910, + 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8, + 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53, + 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8, + 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb, + 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3, + 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60, + 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec, + 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9, + 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b, + 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207, + 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178, + 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6, + 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b, + 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493, + 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c, + 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a, + 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817 +] -JPoint.prototype.mul = function mul(k, kbase) { - k = new BN(k, kbase); +var W = new Array(160) - return this.curve._wnafMul(this, k); -}; +function Sha512 () { + this.init() + this._w = W -JPoint.prototype.eq = function eq(p) { - if (p.type === 'affine') - return this.eq(p.toJ()); + Hash.call(this, 128, 112) +} - if (this === p) - return true; +inherits(Sha512, Hash) - // x1 * z2^2 == x2 * z1^2 - var z2 = this.z.redSqr(); - var pz2 = p.z.redSqr(); - if (this.x.redMul(pz2).redISub(p.x.redMul(z2)).cmpn(0) !== 0) - return false; +Sha512.prototype.init = function () { + this._ah = 0x6a09e667 + this._bh = 0xbb67ae85 + this._ch = 0x3c6ef372 + this._dh = 0xa54ff53a + this._eh = 0x510e527f + this._fh = 0x9b05688c + this._gh = 0x1f83d9ab + this._hh = 0x5be0cd19 - // y1 * z2^3 == y2 * z1^3 - var z3 = z2.redMul(this.z); - var pz3 = pz2.redMul(p.z); - return this.y.redMul(pz3).redISub(p.y.redMul(z3)).cmpn(0) === 0; -}; + this._al = 0xf3bcc908 + this._bl = 0x84caa73b + this._cl = 0xfe94f82b + this._dl = 0x5f1d36f1 + this._el = 0xade682d1 + this._fl = 0x2b3e6c1f + this._gl = 0xfb41bd6b + this._hl = 0x137e2179 -JPoint.prototype.eqXToP = function eqXToP(x) { - var zs = this.z.redSqr(); - var rx = x.toRed(this.curve.red).redMul(zs); - if (this.x.cmp(rx) === 0) - return true; + return this +} - var xc = x.clone(); - var t = this.curve.redN.redMul(zs); - for (;;) { - xc.iadd(this.curve.n); - if (xc.cmp(this.curve.p) >= 0) - return false; +function Ch (x, y, z) { + return z ^ (x & (y ^ z)) +} - rx.redIAdd(t); - if (this.x.cmp(rx) === 0) - return true; - } -}; +function maj (x, y, z) { + return (x & y) | (z & (x | y)) +} -JPoint.prototype.inspect = function inspect() { - if (this.isInfinity()) - return ''; - return ''; -}; +function sigma0 (x, xl) { + return (x >>> 28 | xl << 4) ^ (xl >>> 2 | x << 30) ^ (xl >>> 7 | x << 25) +} -JPoint.prototype.isInfinity = function isInfinity() { - // XXX This code assumes that zero is always zero in red - return this.z.cmpn(0) === 0; -}; +function sigma1 (x, xl) { + return (x >>> 14 | xl << 18) ^ (x >>> 18 | xl << 14) ^ (xl >>> 9 | x << 23) +} -},{"../utils":"F8Ez","bn.js":"BOxy","inherits":"Bm0n","./base":"NX8i"}],"PwwO":[function(require,module,exports) { -'use strict'; +function Gamma0 (x, xl) { + return (x >>> 1 | xl << 31) ^ (x >>> 8 | xl << 24) ^ (x >>> 7) +} -var BN = require('bn.js'); -var inherits = require('inherits'); -var Base = require('./base'); +function Gamma0l (x, xl) { + return (x >>> 1 | xl << 31) ^ (x >>> 8 | xl << 24) ^ (x >>> 7 | xl << 25) +} -var utils = require('../utils'); +function Gamma1 (x, xl) { + return (x >>> 19 | xl << 13) ^ (xl >>> 29 | x << 3) ^ (x >>> 6) +} -function MontCurve(conf) { - Base.call(this, 'mont', conf); +function Gamma1l (x, xl) { + return (x >>> 19 | xl << 13) ^ (xl >>> 29 | x << 3) ^ (x >>> 6 | xl << 26) +} - this.a = new BN(conf.a, 16).toRed(this.red); - this.b = new BN(conf.b, 16).toRed(this.red); - this.i4 = new BN(4).toRed(this.red).redInvm(); - this.two = new BN(2).toRed(this.red); - this.a24 = this.i4.redMul(this.a.redAdd(this.two)); +function getCarry (a, b) { + return (a >>> 0) < (b >>> 0) ? 1 : 0 } -inherits(MontCurve, Base); -module.exports = MontCurve; -MontCurve.prototype.validate = function validate(point) { - var x = point.normalize().x; - var x2 = x.redSqr(); - var rhs = x2.redMul(x).redAdd(x2.redMul(this.a)).redAdd(x); - var y = rhs.redSqrt(); +Sha512.prototype._update = function (M) { + var W = this._w - return y.redSqr().cmp(rhs) === 0; -}; + var ah = this._ah | 0 + var bh = this._bh | 0 + var ch = this._ch | 0 + var dh = this._dh | 0 + var eh = this._eh | 0 + var fh = this._fh | 0 + var gh = this._gh | 0 + var hh = this._hh | 0 -function Point(curve, x, z) { - Base.BasePoint.call(this, curve, 'projective'); - if (x === null && z === null) { - this.x = this.curve.one; - this.z = this.curve.zero; - } else { - this.x = new BN(x, 16); - this.z = new BN(z, 16); - if (!this.x.red) - this.x = this.x.toRed(this.curve.red); - if (!this.z.red) - this.z = this.z.toRed(this.curve.red); + var al = this._al | 0 + var bl = this._bl | 0 + var cl = this._cl | 0 + var dl = this._dl | 0 + var el = this._el | 0 + var fl = this._fl | 0 + var gl = this._gl | 0 + var hl = this._hl | 0 + + for (var i = 0; i < 32; i += 2) { + W[i] = M.readInt32BE(i * 4) + W[i + 1] = M.readInt32BE(i * 4 + 4) } -} -inherits(Point, Base.BasePoint); + for (; i < 160; i += 2) { + var xh = W[i - 15 * 2] + var xl = W[i - 15 * 2 + 1] + var gamma0 = Gamma0(xh, xl) + var gamma0l = Gamma0l(xl, xh) -MontCurve.prototype.decodePoint = function decodePoint(bytes, enc) { - return this.point(utils.toArray(bytes, enc), 1); -}; + xh = W[i - 2 * 2] + xl = W[i - 2 * 2 + 1] + var gamma1 = Gamma1(xh, xl) + var gamma1l = Gamma1l(xl, xh) -MontCurve.prototype.point = function point(x, z) { - return new Point(this, x, z); -}; + // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16] + var Wi7h = W[i - 7 * 2] + var Wi7l = W[i - 7 * 2 + 1] -MontCurve.prototype.pointFromJSON = function pointFromJSON(obj) { - return Point.fromJSON(this, obj); -}; + var Wi16h = W[i - 16 * 2] + var Wi16l = W[i - 16 * 2 + 1] -Point.prototype.precompute = function precompute() { - // No-op -}; + var Wil = (gamma0l + Wi7l) | 0 + var Wih = (gamma0 + Wi7h + getCarry(Wil, gamma0l)) | 0 + Wil = (Wil + gamma1l) | 0 + Wih = (Wih + gamma1 + getCarry(Wil, gamma1l)) | 0 + Wil = (Wil + Wi16l) | 0 + Wih = (Wih + Wi16h + getCarry(Wil, Wi16l)) | 0 -Point.prototype._encode = function _encode() { - return this.getX().toArray('be', this.curve.p.byteLength()); -}; + W[i] = Wih + W[i + 1] = Wil + } -Point.fromJSON = function fromJSON(curve, obj) { - return new Point(curve, obj[0], obj[1] || curve.one); -}; + for (var j = 0; j < 160; j += 2) { + Wih = W[j] + Wil = W[j + 1] -Point.prototype.inspect = function inspect() { - if (this.isInfinity()) - return ''; - return ''; -}; - -Point.prototype.isInfinity = function isInfinity() { - // XXX This code assumes that zero is always zero in red - return this.z.cmpn(0) === 0; -}; - -Point.prototype.dbl = function dbl() { - // http://hyperelliptic.org/EFD/g1p/auto-montgom-xz.html#doubling-dbl-1987-m-3 - // 2M + 2S + 4A - - // A = X1 + Z1 - var a = this.x.redAdd(this.z); - // AA = A^2 - var aa = a.redSqr(); - // B = X1 - Z1 - var b = this.x.redSub(this.z); - // BB = B^2 - var bb = b.redSqr(); - // C = AA - BB - var c = aa.redSub(bb); - // X3 = AA * BB - var nx = aa.redMul(bb); - // Z3 = C * (BB + A24 * C) - var nz = c.redMul(bb.redAdd(this.curve.a24.redMul(c))); - return this.curve.point(nx, nz); -}; + var majh = maj(ah, bh, ch) + var majl = maj(al, bl, cl) -Point.prototype.add = function add() { - throw new Error('Not supported on Montgomery curve'); -}; + var sigma0h = sigma0(ah, al) + var sigma0l = sigma0(al, ah) + var sigma1h = sigma1(eh, el) + var sigma1l = sigma1(el, eh) -Point.prototype.diffAdd = function diffAdd(p, diff) { - // http://hyperelliptic.org/EFD/g1p/auto-montgom-xz.html#diffadd-dadd-1987-m-3 - // 4M + 2S + 6A + // t1 = h + sigma1 + ch + K[j] + W[j] + var Kih = K[j] + var Kil = K[j + 1] - // A = X2 + Z2 - var a = this.x.redAdd(this.z); - // B = X2 - Z2 - var b = this.x.redSub(this.z); - // C = X3 + Z3 - var c = p.x.redAdd(p.z); - // D = X3 - Z3 - var d = p.x.redSub(p.z); - // DA = D * A - var da = d.redMul(a); - // CB = C * B - var cb = c.redMul(b); - // X5 = Z1 * (DA + CB)^2 - var nx = diff.z.redMul(da.redAdd(cb).redSqr()); - // Z5 = X1 * (DA - CB)^2 - var nz = diff.x.redMul(da.redISub(cb).redSqr()); - return this.curve.point(nx, nz); -}; + var chh = Ch(eh, fh, gh) + var chl = Ch(el, fl, gl) -Point.prototype.mul = function mul(k) { - var t = k.clone(); - var a = this; // (N / 2) * Q + Q - var b = this.curve.point(null, null); // (N / 2) * Q - var c = this; // Q + var t1l = (hl + sigma1l) | 0 + var t1h = (hh + sigma1h + getCarry(t1l, hl)) | 0 + t1l = (t1l + chl) | 0 + t1h = (t1h + chh + getCarry(t1l, chl)) | 0 + t1l = (t1l + Kil) | 0 + t1h = (t1h + Kih + getCarry(t1l, Kil)) | 0 + t1l = (t1l + Wil) | 0 + t1h = (t1h + Wih + getCarry(t1l, Wil)) | 0 - for (var bits = []; t.cmpn(0) !== 0; t.iushrn(1)) - bits.push(t.andln(1)); + // t2 = sigma0 + maj + var t2l = (sigma0l + majl) | 0 + var t2h = (sigma0h + majh + getCarry(t2l, sigma0l)) | 0 - for (var i = bits.length - 1; i >= 0; i--) { - if (bits[i] === 0) { - // N * Q + Q = ((N / 2) * Q + Q)) + (N / 2) * Q - a = a.diffAdd(b, c); - // N * Q = 2 * ((N / 2) * Q + Q)) - b = b.dbl(); - } else { - // N * Q = ((N / 2) * Q + Q) + ((N / 2) * Q) - b = a.diffAdd(b, c); - // N * Q + Q = 2 * ((N / 2) * Q + Q) - a = a.dbl(); - } + hh = gh + hl = gl + gh = fh + gl = fl + fh = eh + fl = el + el = (dl + t1l) | 0 + eh = (dh + t1h + getCarry(el, dl)) | 0 + dh = ch + dl = cl + ch = bh + cl = bl + bh = ah + bl = al + al = (t1l + t2l) | 0 + ah = (t1h + t2h + getCarry(al, t1l)) | 0 } - return b; -}; - -Point.prototype.mulAdd = function mulAdd() { - throw new Error('Not supported on Montgomery curve'); -}; -Point.prototype.jumlAdd = function jumlAdd() { - throw new Error('Not supported on Montgomery curve'); -}; + this._al = (this._al + al) | 0 + this._bl = (this._bl + bl) | 0 + this._cl = (this._cl + cl) | 0 + this._dl = (this._dl + dl) | 0 + this._el = (this._el + el) | 0 + this._fl = (this._fl + fl) | 0 + this._gl = (this._gl + gl) | 0 + this._hl = (this._hl + hl) | 0 -Point.prototype.eq = function eq(other) { - return this.getX().cmp(other.getX()) === 0; -}; + this._ah = (this._ah + ah + getCarry(this._al, al)) | 0 + this._bh = (this._bh + bh + getCarry(this._bl, bl)) | 0 + this._ch = (this._ch + ch + getCarry(this._cl, cl)) | 0 + this._dh = (this._dh + dh + getCarry(this._dl, dl)) | 0 + this._eh = (this._eh + eh + getCarry(this._el, el)) | 0 + this._fh = (this._fh + fh + getCarry(this._fl, fl)) | 0 + this._gh = (this._gh + gh + getCarry(this._gl, gl)) | 0 + this._hh = (this._hh + hh + getCarry(this._hl, hl)) | 0 +} -Point.prototype.normalize = function normalize() { - this.x = this.x.redMul(this.z.redInvm()); - this.z = this.curve.one; - return this; -}; +Sha512.prototype._hash = function () { + var H = Buffer.allocUnsafe(64) -Point.prototype.getX = function getX() { - // Normalize coordinates - this.normalize(); + function writeInt64BE (h, l, offset) { + H.writeInt32BE(h, offset) + H.writeInt32BE(l, offset + 4) + } - return this.x.fromRed(); -}; + writeInt64BE(this._ah, this._al, 0) + writeInt64BE(this._bh, this._bl, 8) + writeInt64BE(this._ch, this._cl, 16) + writeInt64BE(this._dh, this._dl, 24) + writeInt64BE(this._eh, this._el, 32) + writeInt64BE(this._fh, this._fl, 40) + writeInt64BE(this._gh, this._gl, 48) + writeInt64BE(this._hh, this._hl, 56) -},{"bn.js":"BOxy","inherits":"Bm0n","./base":"NX8i","../utils":"F8Ez"}],"tiqw":[function(require,module,exports) { -'use strict'; + return H +} -var utils = require('../utils'); -var BN = require('bn.js'); -var inherits = require('inherits'); -var Base = require('./base'); +module.exports = Sha512 -var assert = utils.assert; +},{"inherits":"Bm0n","./hash":"VHby","safe-buffer":"Wugr"}],"V2o3":[function(require,module,exports) { -function EdwardsCurve(conf) { - // NOTE: Important as we are creating point in Base.call() - this.twisted = (conf.a | 0) !== 1; - this.mOneA = this.twisted && (conf.a | 0) === -1; - this.extended = this.mOneA; +var inherits = require('inherits') +var SHA512 = require('./sha512') +var Hash = require('./hash') +var Buffer = require('safe-buffer').Buffer - Base.call(this, 'edwards', conf); +var W = new Array(160) - this.a = new BN(conf.a, 16).umod(this.red.m); - this.a = this.a.toRed(this.red); - this.c = new BN(conf.c, 16).toRed(this.red); - this.c2 = this.c.redSqr(); - this.d = new BN(conf.d, 16).toRed(this.red); - this.dd = this.d.redAdd(this.d); +function Sha384 () { + this.init() + this._w = W - assert(!this.twisted || this.c.fromRed().cmpn(1) === 0); - this.oneC = (conf.c | 0) === 1; + Hash.call(this, 128, 112) } -inherits(EdwardsCurve, Base); -module.exports = EdwardsCurve; -EdwardsCurve.prototype._mulA = function _mulA(num) { - if (this.mOneA) - return num.redNeg(); - else - return this.a.redMul(num); -}; +inherits(Sha384, SHA512) -EdwardsCurve.prototype._mulC = function _mulC(num) { - if (this.oneC) - return num; - else - return this.c.redMul(num); -}; +Sha384.prototype.init = function () { + this._ah = 0xcbbb9d5d + this._bh = 0x629a292a + this._ch = 0x9159015a + this._dh = 0x152fecd8 + this._eh = 0x67332667 + this._fh = 0x8eb44a87 + this._gh = 0xdb0c2e0d + this._hh = 0x47b5481d -// Just for compatibility with Short curve -EdwardsCurve.prototype.jpoint = function jpoint(x, y, z, t) { - return this.point(x, y, z, t); -}; + this._al = 0xc1059ed8 + this._bl = 0x367cd507 + this._cl = 0x3070dd17 + this._dl = 0xf70e5939 + this._el = 0xffc00b31 + this._fl = 0x68581511 + this._gl = 0x64f98fa7 + this._hl = 0xbefa4fa4 -EdwardsCurve.prototype.pointFromX = function pointFromX(x, odd) { - x = new BN(x, 16); - if (!x.red) - x = x.toRed(this.red); + return this +} - var x2 = x.redSqr(); - var rhs = this.c2.redSub(this.a.redMul(x2)); - var lhs = this.one.redSub(this.c2.redMul(this.d).redMul(x2)); +Sha384.prototype._hash = function () { + var H = Buffer.allocUnsafe(48) - var y2 = rhs.redMul(lhs.redInvm()); - var y = y2.redSqrt(); - if (y.redSqr().redSub(y2).cmp(this.zero) !== 0) - throw new Error('invalid point'); + function writeInt64BE (h, l, offset) { + H.writeInt32BE(h, offset) + H.writeInt32BE(l, offset + 4) + } - var isOdd = y.fromRed().isOdd(); - if (odd && !isOdd || !odd && isOdd) - y = y.redNeg(); + writeInt64BE(this._ah, this._al, 0) + writeInt64BE(this._bh, this._bl, 8) + writeInt64BE(this._ch, this._cl, 16) + writeInt64BE(this._dh, this._dl, 24) + writeInt64BE(this._eh, this._el, 32) + writeInt64BE(this._fh, this._fl, 40) - return this.point(x, y); -}; + return H +} -EdwardsCurve.prototype.pointFromY = function pointFromY(y, odd) { - y = new BN(y, 16); - if (!y.red) - y = y.toRed(this.red); +module.exports = Sha384 - // x^2 = (y^2 - c^2) / (c^2 d y^2 - a) - var y2 = y.redSqr(); - var lhs = y2.redSub(this.c2); - var rhs = y2.redMul(this.d).redMul(this.c2).redSub(this.a); - var x2 = lhs.redMul(rhs.redInvm()); +},{"inherits":"Bm0n","./sha512":"sILY","./hash":"VHby","safe-buffer":"Wugr"}],"t0b9":[function(require,module,exports) { +var exports = module.exports = function SHA (algorithm) { + algorithm = algorithm.toLowerCase() - if (x2.cmp(this.zero) === 0) { - if (odd) - throw new Error('invalid point'); - else - return this.point(this.zero, y); - } + var Algorithm = exports[algorithm] + if (!Algorithm) throw new Error(algorithm + ' is not supported (we accept pull requests)') - var x = x2.redSqrt(); - if (x.redSqr().redSub(x2).cmp(this.zero) !== 0) - throw new Error('invalid point'); + return new Algorithm() +} - if (x.fromRed().isOdd() !== odd) - x = x.redNeg(); +exports.sha = require('./sha') +exports.sha1 = require('./sha1') +exports.sha224 = require('./sha224') +exports.sha256 = require('./sha256') +exports.sha384 = require('./sha384') +exports.sha512 = require('./sha512') - return this.point(x, y); -}; +},{"./sha":"j9dE","./sha1":"oPH4","./sha224":"MeLE","./sha256":"IUSb","./sha384":"V2o3","./sha512":"sILY"}],"z0rv":[function(require,module,exports) { -EdwardsCurve.prototype.validate = function validate(point) { - if (point.isInfinity()) - return true; +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. - // Curve: A * X^2 + Y^2 = C^2 * (1 + D * X^2 * Y^2) - point.normalize(); +'use strict'; - var x2 = point.x.redSqr(); - var y2 = point.y.redSqr(); - var lhs = x2.redMul(this.a).redAdd(y2); - var rhs = this.c2.redMul(this.one.redAdd(this.d.redMul(x2).redMul(y2))); +/**/ - return lhs.cmp(rhs) === 0; -}; +var Buffer = require('safe-buffer').Buffer; +/**/ -function Point(curve, x, y, z, t) { - Base.BasePoint.call(this, curve, 'projective'); - if (x === null && y === null && z === null) { - this.x = this.curve.zero; - this.y = this.curve.one; - this.z = this.curve.one; - this.t = this.curve.zero; - this.zOne = true; - } else { - this.x = new BN(x, 16); - this.y = new BN(y, 16); - this.z = z ? new BN(z, 16) : this.curve.one; - this.t = t && new BN(t, 16); - if (!this.x.red) - this.x = this.x.toRed(this.curve.red); - if (!this.y.red) - this.y = this.y.toRed(this.curve.red); - if (!this.z.red) - this.z = this.z.toRed(this.curve.red); - if (this.t && !this.t.red) - this.t = this.t.toRed(this.curve.red); - this.zOne = this.z === this.curve.one; +var isEncoding = Buffer.isEncoding || function (encoding) { + encoding = '' + encoding; + switch (encoding && encoding.toLowerCase()) { + case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': + return true; + default: + return false; + } +}; - // Use extended coordinates - if (this.curve.extended && !this.t) { - this.t = this.x.redMul(this.y); - if (!this.zOne) - this.t = this.t.redMul(this.z.redInvm()); +function _normalizeEncoding(enc) { + if (!enc) return 'utf8'; + var retried; + while (true) { + switch (enc) { + case 'utf8': + case 'utf-8': + return 'utf8'; + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return 'utf16le'; + case 'latin1': + case 'binary': + return 'latin1'; + case 'base64': + case 'ascii': + case 'hex': + return enc; + default: + if (retried) return; // undefined + enc = ('' + enc).toLowerCase(); + retried = true; } } +}; + +// Do not cache `Buffer.isEncoding` when checking encoding names as some +// modules monkey-patch it to support additional encodings +function normalizeEncoding(enc) { + var nenc = _normalizeEncoding(enc); + if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); + return nenc || enc; } -inherits(Point, Base.BasePoint); -EdwardsCurve.prototype.pointFromJSON = function pointFromJSON(obj) { - return Point.fromJSON(this, obj); -}; +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. +exports.StringDecoder = StringDecoder; +function StringDecoder(encoding) { + this.encoding = normalizeEncoding(encoding); + var nb; + switch (this.encoding) { + case 'utf16le': + this.text = utf16Text; + this.end = utf16End; + nb = 4; + break; + case 'utf8': + this.fillLast = utf8FillLast; + nb = 4; + break; + case 'base64': + this.text = base64Text; + this.end = base64End; + nb = 3; + break; + default: + this.write = simpleWrite; + this.end = simpleEnd; + return; + } + this.lastNeed = 0; + this.lastTotal = 0; + this.lastChar = Buffer.allocUnsafe(nb); +} -EdwardsCurve.prototype.point = function point(x, y, z, t) { - return new Point(this, x, y, z, t); +StringDecoder.prototype.write = function (buf) { + if (buf.length === 0) return ''; + var r; + var i; + if (this.lastNeed) { + r = this.fillLast(buf); + if (r === undefined) return ''; + i = this.lastNeed; + this.lastNeed = 0; + } else { + i = 0; + } + if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); + return r || ''; }; -Point.fromJSON = function fromJSON(curve, obj) { - return new Point(curve, obj[0], obj[1], obj[2]); -}; +StringDecoder.prototype.end = utf8End; -Point.prototype.inspect = function inspect() { - if (this.isInfinity()) - return ''; - return ''; -}; +// Returns only complete characters in a Buffer +StringDecoder.prototype.text = utf8Text; -Point.prototype.isInfinity = function isInfinity() { - // XXX This code assumes that zero is always zero in red - return this.x.cmpn(0) === 0 && - (this.y.cmp(this.z) === 0 || - (this.zOne && this.y.cmp(this.curve.c) === 0)); +// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer +StringDecoder.prototype.fillLast = function (buf) { + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); + this.lastNeed -= buf.length; }; -Point.prototype._extDbl = function _extDbl() { - // hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html - // #doubling-dbl-2008-hwcd - // 4M + 4S +// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a +// continuation byte. If an invalid byte is detected, -2 is returned. +function utf8CheckByte(byte) { + if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; + return byte >> 6 === 0x02 ? -1 : -2; +} - // A = X1^2 - var a = this.x.redSqr(); - // B = Y1^2 - var b = this.y.redSqr(); - // C = 2 * Z1^2 - var c = this.z.redSqr(); - c = c.redIAdd(c); - // D = a * A - var d = this.curve._mulA(a); - // E = (X1 + Y1)^2 - A - B - var e = this.x.redAdd(this.y).redSqr().redISub(a).redISub(b); - // G = D + B - var g = d.redAdd(b); - // F = G - C - var f = g.redSub(c); - // H = D - B - var h = d.redSub(b); - // X3 = E * F - var nx = e.redMul(f); - // Y3 = G * H - var ny = g.redMul(h); - // T3 = E * H - var nt = e.redMul(h); - // Z3 = F * G - var nz = f.redMul(g); - return this.curve.point(nx, ny, nz, nt); -}; +// Checks at most 3 bytes at the end of a Buffer in order to detect an +// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) +// needed to complete the UTF-8 character (if applicable) are returned. +function utf8CheckIncomplete(self, buf, i) { + var j = buf.length - 1; + if (j < i) return 0; + var nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 1; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 2; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) { + if (nb === 2) nb = 0;else self.lastNeed = nb - 3; + } + return nb; + } + return 0; +} -Point.prototype._projDbl = function _projDbl() { - // hyperelliptic.org/EFD/g1p/auto-twisted-projective.html - // #doubling-dbl-2008-bbjlp - // #doubling-dbl-2007-bl - // and others - // Generally 3M + 4S or 2M + 4S +// Validates as many continuation bytes for a multi-byte UTF-8 character as +// needed or are available. If we see a non-continuation byte where we expect +// one, we "replace" the validated continuation bytes we've seen so far with +// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding +// behavior. The continuation byte check is included three times in the case +// where all of the continuation bytes for a character exist in the same buffer. +// It is also done this way as a slight performance increase instead of using a +// loop. +function utf8CheckExtraBytes(self, buf, p) { + if ((buf[0] & 0xC0) !== 0x80) { + self.lastNeed = 0; + return '\ufffd'; + } + if (self.lastNeed > 1 && buf.length > 1) { + if ((buf[1] & 0xC0) !== 0x80) { + self.lastNeed = 1; + return '\ufffd'; + } + if (self.lastNeed > 2 && buf.length > 2) { + if ((buf[2] & 0xC0) !== 0x80) { + self.lastNeed = 2; + return '\ufffd'; + } + } + } +} - // B = (X1 + Y1)^2 - var b = this.x.redAdd(this.y).redSqr(); - // C = X1^2 - var c = this.x.redSqr(); - // D = Y1^2 - var d = this.y.redSqr(); +// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. +function utf8FillLast(buf) { + var p = this.lastTotal - this.lastNeed; + var r = utf8CheckExtraBytes(this, buf, p); + if (r !== undefined) return r; + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, p, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, p, 0, buf.length); + this.lastNeed -= buf.length; +} - var nx; - var ny; - var nz; - if (this.curve.twisted) { - // E = a * C - var e = this.curve._mulA(c); - // F = E + D - var f = e.redAdd(d); - if (this.zOne) { - // X3 = (B - C - D) * (F - 2) - nx = b.redSub(c).redSub(d).redMul(f.redSub(this.curve.two)); - // Y3 = F * (E - D) - ny = f.redMul(e.redSub(d)); - // Z3 = F^2 - 2 * F - nz = f.redSqr().redSub(f).redSub(f); - } else { - // H = Z1^2 - var h = this.z.redSqr(); - // J = F - 2 * H - var j = f.redSub(h).redISub(h); - // X3 = (B-C-D)*J - nx = b.redSub(c).redISub(d).redMul(j); - // Y3 = F * (E - D) - ny = f.redMul(e.redSub(d)); - // Z3 = F * J - nz = f.redMul(j); +// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a +// partial character, the character's bytes are buffered until the required +// number of bytes are available. +function utf8Text(buf, i) { + var total = utf8CheckIncomplete(this, buf, i); + if (!this.lastNeed) return buf.toString('utf8', i); + this.lastTotal = total; + var end = buf.length - (total - this.lastNeed); + buf.copy(this.lastChar, 0, end); + return buf.toString('utf8', i, end); +} + +// For UTF-8, a replacement character is added when ending on a partial +// character. +function utf8End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + '\ufffd'; + return r; +} + +// UTF-16LE typically needs two bytes per character, but even if we have an even +// number of bytes available, we need to check if we end on a leading/high +// surrogate. In that case, we need to wait for the next two bytes in order to +// decode the last character properly. +function utf16Text(buf, i) { + if ((buf.length - i) % 2 === 0) { + var r = buf.toString('utf16le', i); + if (r) { + var c = r.charCodeAt(r.length - 1); + if (c >= 0xD800 && c <= 0xDBFF) { + this.lastNeed = 2; + this.lastTotal = 4; + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + return r.slice(0, -1); + } } - } else { - // E = C + D - var e = c.redAdd(d); - // H = (c * Z1)^2 - var h = this.curve._mulC(this.z).redSqr(); - // J = E - 2 * H - var j = e.redSub(h).redSub(h); - // X3 = c * (B - E) * J - nx = this.curve._mulC(b.redISub(e)).redMul(j); - // Y3 = c * E * (C - D) - ny = this.curve._mulC(e).redMul(c.redISub(d)); - // Z3 = E * J - nz = e.redMul(j); + return r; } - return this.curve.point(nx, ny, nz); -}; + this.lastNeed = 1; + this.lastTotal = 2; + this.lastChar[0] = buf[buf.length - 1]; + return buf.toString('utf16le', i, buf.length - 1); +} -Point.prototype.dbl = function dbl() { - if (this.isInfinity()) - return this; +// For UTF-16LE we do not explicitly append special replacement characters if we +// end on a partial character, we simply let v8 handle that. +function utf16End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) { + var end = this.lastTotal - this.lastNeed; + return r + this.lastChar.toString('utf16le', 0, end); + } + return r; +} - // Double in extended coordinates - if (this.curve.extended) - return this._extDbl(); - else - return this._projDbl(); -}; +function base64Text(buf, i) { + var n = (buf.length - i) % 3; + if (n === 0) return buf.toString('base64', i); + this.lastNeed = 3 - n; + this.lastTotal = 3; + if (n === 1) { + this.lastChar[0] = buf[buf.length - 1]; + } else { + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + } + return buf.toString('base64', i, buf.length - n); +} -Point.prototype._extAdd = function _extAdd(p) { - // hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html - // #addition-add-2008-hwcd-3 - // 8M +function base64End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); + return r; +} - // A = (Y1 - X1) * (Y2 - X2) - var a = this.y.redSub(this.x).redMul(p.y.redSub(p.x)); - // B = (Y1 + X1) * (Y2 + X2) - var b = this.y.redAdd(this.x).redMul(p.y.redAdd(p.x)); - // C = T1 * k * T2 - var c = this.t.redMul(this.curve.dd).redMul(p.t); - // D = Z1 * 2 * Z2 - var d = this.z.redMul(p.z.redAdd(p.z)); - // E = B - A - var e = b.redSub(a); - // F = D - C - var f = d.redSub(c); - // G = D + C - var g = d.redAdd(c); - // H = B + A - var h = b.redAdd(a); - // X3 = E * F - var nx = e.redMul(f); - // Y3 = G * H - var ny = g.redMul(h); - // T3 = E * H - var nt = e.redMul(h); - // Z3 = F * G - var nz = f.redMul(g); - return this.curve.point(nx, ny, nz, nt); -}; +// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) +function simpleWrite(buf) { + return buf.toString(this.encoding); +} -Point.prototype._projAdd = function _projAdd(p) { - // hyperelliptic.org/EFD/g1p/auto-twisted-projective.html - // #addition-add-2008-bbjlp - // #addition-add-2007-bl - // 10M + 1S +function simpleEnd(buf) { + return buf && buf.length ? this.write(buf) : ''; +} +},{"safe-buffer":"Wugr"}],"bjfr":[function(require,module,exports) { - // A = Z1 * Z2 - var a = this.z.redMul(p.z); - // B = A^2 - var b = a.redSqr(); - // C = X1 * X2 - var c = this.x.redMul(p.x); - // D = Y1 * Y2 - var d = this.y.redMul(p.y); - // E = d * C * D - var e = this.curve.d.redMul(c).redMul(d); - // F = B - E - var f = b.redSub(e); - // G = B + E - var g = b.redAdd(e); - // X3 = A * F * ((X1 + Y1) * (X2 + Y2) - C - D) - var tmp = this.x.redAdd(this.y).redMul(p.x.redAdd(p.y)).redISub(c).redISub(d); - var nx = a.redMul(f).redMul(tmp); - var ny; - var nz; - if (this.curve.twisted) { - // Y3 = A * G * (D - a * C) - ny = a.redMul(g).redMul(d.redSub(this.curve._mulA(c))); - // Z3 = F * G - nz = f.redMul(g); +var Buffer = require('safe-buffer').Buffer +var Transform = require('stream').Transform +var StringDecoder = require('string_decoder').StringDecoder +var inherits = require('inherits') + +function CipherBase (hashMode) { + Transform.call(this) + this.hashMode = typeof hashMode === 'string' + if (this.hashMode) { + this[hashMode] = this._finalOrDigest } else { - // Y3 = A * G * (D - C) - ny = a.redMul(g).redMul(d.redSub(c)); - // Z3 = c * F * G - nz = this.curve._mulC(f).redMul(g); + this.final = this._finalOrDigest } - return this.curve.point(nx, ny, nz); -}; + if (this._final) { + this.__final = this._final + this._final = null + } + this._decoder = null + this._encoding = null +} +inherits(CipherBase, Transform) -Point.prototype.add = function add(p) { - if (this.isInfinity()) - return p; - if (p.isInfinity()) - return this; +CipherBase.prototype.update = function (data, inputEnc, outputEnc) { + if (typeof data === 'string') { + data = Buffer.from(data, inputEnc) + } - if (this.curve.extended) - return this._extAdd(p); - else - return this._projAdd(p); -}; + var outData = this._update(data) + if (this.hashMode) return this -Point.prototype.mul = function mul(k) { - if (this._hasDoubles(k)) - return this.curve._fixedNafMul(this, k); - else - return this.curve._wnafMul(this, k); -}; + if (outputEnc) { + outData = this._toString(outData, outputEnc) + } -Point.prototype.mulAdd = function mulAdd(k1, p, k2) { - return this.curve._wnafMulAdd(1, [ this, p ], [ k1, k2 ], 2, false); -}; + return outData +} -Point.prototype.jmulAdd = function jmulAdd(k1, p, k2) { - return this.curve._wnafMulAdd(1, [ this, p ], [ k1, k2 ], 2, true); -}; +CipherBase.prototype.setAutoPadding = function () {} +CipherBase.prototype.getAuthTag = function () { + throw new Error('trying to get auth tag in unsupported state') +} -Point.prototype.normalize = function normalize() { - if (this.zOne) - return this; +CipherBase.prototype.setAuthTag = function () { + throw new Error('trying to set auth tag in unsupported state') +} - // Normalize coordinates - var zi = this.z.redInvm(); - this.x = this.x.redMul(zi); - this.y = this.y.redMul(zi); - if (this.t) - this.t = this.t.redMul(zi); - this.z = this.curve.one; - this.zOne = true; - return this; -}; +CipherBase.prototype.setAAD = function () { + throw new Error('trying to set aad in unsupported state') +} -Point.prototype.neg = function neg() { - return this.curve.point(this.x.redNeg(), - this.y, - this.z, - this.t && this.t.redNeg()); -}; +CipherBase.prototype._transform = function (data, _, next) { + var err + try { + if (this.hashMode) { + this._update(data) + } else { + this.push(this._update(data)) + } + } catch (e) { + err = e + } finally { + next(err) + } +} +CipherBase.prototype._flush = function (done) { + var err + try { + this.push(this.__final()) + } catch (e) { + err = e + } -Point.prototype.getX = function getX() { - this.normalize(); - return this.x.fromRed(); -}; + done(err) +} +CipherBase.prototype._finalOrDigest = function (outputEnc) { + var outData = this.__final() || Buffer.alloc(0) + if (outputEnc) { + outData = this._toString(outData, outputEnc, true) + } + return outData +} -Point.prototype.getY = function getY() { - this.normalize(); - return this.y.fromRed(); -}; +CipherBase.prototype._toString = function (value, enc, fin) { + if (!this._decoder) { + this._decoder = new StringDecoder(enc) + this._encoding = enc + } -Point.prototype.eq = function eq(other) { - return this === other || - this.getX().cmp(other.getX()) === 0 && - this.getY().cmp(other.getY()) === 0; -}; + if (this._encoding !== enc) throw new Error('can\'t switch encodings') -Point.prototype.eqXToP = function eqXToP(x) { - var rx = x.toRed(this.curve.red).redMul(this.z); - if (this.x.cmp(rx) === 0) - return true; + var out = this._decoder.write(value) + if (fin) { + out += this._decoder.end() + } - var xc = x.clone(); - var t = this.curve.redN.redMul(this.z); - for (;;) { - xc.iadd(this.curve.n); - if (xc.cmp(this.curve.p) >= 0) - return false; + return out +} - rx.redIAdd(t); - if (this.x.cmp(rx) === 0) - return true; - } -}; +module.exports = CipherBase -// Compatibility with BaseCurve -Point.prototype.toP = Point.prototype.normalize; -Point.prototype.mixedAdd = Point.prototype.add; +},{"safe-buffer":"Wugr","stream":"fnRj","string_decoder":"z0rv","inherits":"Bm0n"}],"LF8r":[function(require,module,exports) { +'use strict' +var inherits = require('inherits') +var MD5 = require('md5.js') +var RIPEMD160 = require('ripemd160') +var sha = require('sha.js') +var Base = require('cipher-base') -},{"../utils":"F8Ez","bn.js":"BOxy","inherits":"Bm0n","./base":"NX8i"}],"P4Ml":[function(require,module,exports) { -'use strict'; +function Hash (hash) { + Base.call(this, 'digest') -var curve = exports; + this._hash = hash +} -curve.base = require('./base'); -curve.short = require('./short'); -curve.mont = require('./mont'); -curve.edwards = require('./edwards'); +inherits(Hash, Base) -},{"./base":"NX8i","./short":"CO0D","./mont":"PwwO","./edwards":"tiqw"}],"eeOV":[function(require,module,exports) { -'use strict'; +Hash.prototype._update = function (data) { + this._hash.update(data) +} -var assert = require('minimalistic-assert'); -var inherits = require('inherits'); +Hash.prototype._final = function () { + return this._hash.digest() +} -exports.inherits = inherits; +module.exports = function createHash (alg) { + alg = alg.toLowerCase() + if (alg === 'md5') return new MD5() + if (alg === 'rmd160' || alg === 'ripemd160') return new RIPEMD160() -function isSurrogatePair(msg, i) { - if ((msg.charCodeAt(i) & 0xFC00) !== 0xD800) { - return false; + return new Hash(sha(alg)) +} + +},{"inherits":"Bm0n","md5.js":"OP64","ripemd160":"quyi","sha.js":"t0b9","cipher-base":"bjfr"}],"aHbo":[function(require,module,exports) { + +'use strict' +var inherits = require('inherits') +var Buffer = require('safe-buffer').Buffer + +var Base = require('cipher-base') + +var ZEROS = Buffer.alloc(128) +var blocksize = 64 + +function Hmac (alg, key) { + Base.call(this, 'digest') + if (typeof key === 'string') { + key = Buffer.from(key) } - if (i < 0 || i + 1 >= msg.length) { - return false; + + this._alg = alg + this._key = key + + if (key.length > blocksize) { + key = alg(key) + } else if (key.length < blocksize) { + key = Buffer.concat([key, ZEROS], blocksize) } - return (msg.charCodeAt(i + 1) & 0xFC00) === 0xDC00; + + var ipad = this._ipad = Buffer.allocUnsafe(blocksize) + var opad = this._opad = Buffer.allocUnsafe(blocksize) + + for (var i = 0; i < blocksize; i++) { + ipad[i] = key[i] ^ 0x36 + opad[i] = key[i] ^ 0x5C + } + + this._hash = [ipad] } -function toArray(msg, enc) { - if (Array.isArray(msg)) - return msg.slice(); - if (!msg) - return []; - var res = []; - if (typeof msg === 'string') { - if (!enc) { - // Inspired by stringToUtf8ByteArray() in closure-library by Google - // https://github.com/google/closure-library/blob/8598d87242af59aac233270742c8984e2b2bdbe0/closure/goog/crypt/crypt.js#L117-L143 - // Apache License 2.0 - // https://github.com/google/closure-library/blob/master/LICENSE - var p = 0; - for (var i = 0; i < msg.length; i++) { - var c = msg.charCodeAt(i); - if (c < 128) { - res[p++] = c; - } else if (c < 2048) { - res[p++] = (c >> 6) | 192; - res[p++] = (c & 63) | 128; - } else if (isSurrogatePair(msg, i)) { - c = 0x10000 + ((c & 0x03FF) << 10) + (msg.charCodeAt(++i) & 0x03FF); - res[p++] = (c >> 18) | 240; - res[p++] = ((c >> 12) & 63) | 128; - res[p++] = ((c >> 6) & 63) | 128; - res[p++] = (c & 63) | 128; - } else { - res[p++] = (c >> 12) | 224; - res[p++] = ((c >> 6) & 63) | 128; - res[p++] = (c & 63) | 128; - } - } - } else if (enc === 'hex') { - msg = msg.replace(/[^a-z0-9]+/ig, ''); - if (msg.length % 2 !== 0) - msg = '0' + msg; - for (i = 0; i < msg.length; i += 2) - res.push(parseInt(msg[i] + msg[i + 1], 16)); - } - } else { - for (i = 0; i < msg.length; i++) - res[i] = msg[i] | 0; - } - return res; -} -exports.toArray = toArray; +inherits(Hmac, Base) -function toHex(msg) { - var res = ''; - for (var i = 0; i < msg.length; i++) - res += zero2(msg[i].toString(16)); - return res; +Hmac.prototype._update = function (data) { + this._hash.push(data) } -exports.toHex = toHex; -function htonl(w) { - var res = (w >>> 24) | - ((w >>> 8) & 0xff00) | - ((w << 8) & 0xff0000) | - ((w & 0xff) << 24); - return res >>> 0; +Hmac.prototype._final = function () { + var h = this._alg(Buffer.concat(this._hash)) + return this._alg(Buffer.concat([this._opad, h])) } -exports.htonl = htonl; +module.exports = Hmac -function toHex32(msg, endian) { - var res = ''; - for (var i = 0; i < msg.length; i++) { - var w = msg[i]; - if (endian === 'little') - w = htonl(w); - res += zero8(w.toString(16)); - } - return res; -} -exports.toHex32 = toHex32; +},{"inherits":"Bm0n","safe-buffer":"Wugr","cipher-base":"bjfr"}],"Mobq":[function(require,module,exports) { +var MD5 = require('md5.js') -function zero2(word) { - if (word.length === 1) - return '0' + word; - else - return word; +module.exports = function (buffer) { + return new MD5().update(buffer).digest() } -exports.zero2 = zero2; -function zero8(word) { - if (word.length === 7) - return '0' + word; - else if (word.length === 6) - return '00' + word; - else if (word.length === 5) - return '000' + word; - else if (word.length === 4) - return '0000' + word; - else if (word.length === 3) - return '00000' + word; - else if (word.length === 2) - return '000000' + word; - else if (word.length === 1) - return '0000000' + word; - else - return word; -} -exports.zero8 = zero8; +},{"md5.js":"OP64"}],"Cx6S":[function(require,module,exports) { -function join32(msg, start, end, endian) { - var len = end - start; - assert(len % 4 === 0); - var res = new Array(len / 4); - for (var i = 0, k = start; i < res.length; i++, k += 4) { - var w; - if (endian === 'big') - w = (msg[k] << 24) | (msg[k + 1] << 16) | (msg[k + 2] << 8) | msg[k + 3]; - else - w = (msg[k + 3] << 24) | (msg[k + 2] << 16) | (msg[k + 1] << 8) | msg[k]; - res[i] = w >>> 0; - } - return res; -} -exports.join32 = join32; +'use strict' +var inherits = require('inherits') +var Legacy = require('./legacy') +var Base = require('cipher-base') +var Buffer = require('safe-buffer').Buffer +var md5 = require('create-hash/md5') +var RIPEMD160 = require('ripemd160') -function split32(msg, endian) { - var res = new Array(msg.length * 4); - for (var i = 0, k = 0; i < msg.length; i++, k += 4) { - var m = msg[i]; - if (endian === 'big') { - res[k] = m >>> 24; - res[k + 1] = (m >>> 16) & 0xff; - res[k + 2] = (m >>> 8) & 0xff; - res[k + 3] = m & 0xff; - } else { - res[k + 3] = m >>> 24; - res[k + 2] = (m >>> 16) & 0xff; - res[k + 1] = (m >>> 8) & 0xff; - res[k] = m & 0xff; - } - } - return res; -} -exports.split32 = split32; +var sha = require('sha.js') -function rotr32(w, b) { - return (w >>> b) | (w << (32 - b)); -} -exports.rotr32 = rotr32; +var ZEROS = Buffer.alloc(128) -function rotl32(w, b) { - return (w << b) | (w >>> (32 - b)); -} -exports.rotl32 = rotl32; +function Hmac (alg, key) { + Base.call(this, 'digest') + if (typeof key === 'string') { + key = Buffer.from(key) + } -function sum32(a, b) { - return (a + b) >>> 0; -} -exports.sum32 = sum32; + var blocksize = (alg === 'sha512' || alg === 'sha384') ? 128 : 64 -function sum32_3(a, b, c) { - return (a + b + c) >>> 0; -} -exports.sum32_3 = sum32_3; + this._alg = alg + this._key = key + if (key.length > blocksize) { + var hash = alg === 'rmd160' ? new RIPEMD160() : sha(alg) + key = hash.update(key).digest() + } else if (key.length < blocksize) { + key = Buffer.concat([key, ZEROS], blocksize) + } -function sum32_4(a, b, c, d) { - return (a + b + c + d) >>> 0; -} -exports.sum32_4 = sum32_4; + var ipad = this._ipad = Buffer.allocUnsafe(blocksize) + var opad = this._opad = Buffer.allocUnsafe(blocksize) -function sum32_5(a, b, c, d, e) { - return (a + b + c + d + e) >>> 0; + for (var i = 0; i < blocksize; i++) { + ipad[i] = key[i] ^ 0x36 + opad[i] = key[i] ^ 0x5C + } + this._hash = alg === 'rmd160' ? new RIPEMD160() : sha(alg) + this._hash.update(ipad) } -exports.sum32_5 = sum32_5; -function sum64(buf, pos, ah, al) { - var bh = buf[pos]; - var bl = buf[pos + 1]; +inherits(Hmac, Base) - var lo = (al + bl) >>> 0; - var hi = (lo < al ? 1 : 0) + ah + bh; - buf[pos] = hi >>> 0; - buf[pos + 1] = lo; +Hmac.prototype._update = function (data) { + this._hash.update(data) } -exports.sum64 = sum64; -function sum64_hi(ah, al, bh, bl) { - var lo = (al + bl) >>> 0; - var hi = (lo < al ? 1 : 0) + ah + bh; - return hi >>> 0; +Hmac.prototype._final = function () { + var h = this._hash.digest() + var hash = this._alg === 'rmd160' ? new RIPEMD160() : sha(this._alg) + return hash.update(this._opad).update(h).digest() } -exports.sum64_hi = sum64_hi; -function sum64_lo(ah, al, bh, bl) { - var lo = al + bl; - return lo >>> 0; +module.exports = function createHmac (alg, key) { + alg = alg.toLowerCase() + if (alg === 'rmd160' || alg === 'ripemd160') { + return new Hmac('rmd160', key) + } + if (alg === 'md5') { + return new Legacy(md5, key) + } + return new Hmac(alg, key) } -exports.sum64_lo = sum64_lo; -function sum64_4_hi(ah, al, bh, bl, ch, cl, dh, dl) { - var carry = 0; - var lo = al; - lo = (lo + bl) >>> 0; - carry += lo < al ? 1 : 0; - lo = (lo + cl) >>> 0; - carry += lo < cl ? 1 : 0; - lo = (lo + dl) >>> 0; - carry += lo < dl ? 1 : 0; +},{"inherits":"Bm0n","./legacy":"aHbo","cipher-base":"bjfr","safe-buffer":"Wugr","create-hash/md5":"Mobq","ripemd160":"quyi","sha.js":"t0b9"}],"V9ao":[function(require,module,exports) { +"use strict"; - var hi = ah + bh + ch + dh + carry; - return hi >>> 0; -} -exports.sum64_4_hi = sum64_4_hi; +Object.defineProperty(exports, "__esModule", { + value: true +}); -function sum64_4_lo(ah, al, bh, bl, ch, cl, dh, dl) { - var lo = al + bl + cl + dl; - return lo >>> 0; -} -exports.sum64_4_lo = sum64_4_lo; +var createHash = require('create-hash'); -function sum64_5_hi(ah, al, bh, bl, ch, cl, dh, dl, eh, el) { - var carry = 0; - var lo = al; - lo = (lo + bl) >>> 0; - carry += lo < al ? 1 : 0; - lo = (lo + cl) >>> 0; - carry += lo < cl ? 1 : 0; - lo = (lo + dl) >>> 0; - carry += lo < dl ? 1 : 0; - lo = (lo + el) >>> 0; - carry += lo < el ? 1 : 0; +var createHmac = require('create-hmac'); - var hi = ah + bh + ch + dh + eh + carry; - return hi >>> 0; +function hash160(buffer) { + var sha256Hash = createHash('sha256').update(buffer).digest(); + + try { + return createHash('rmd160').update(sha256Hash).digest(); + } catch (err) { + return createHash('ripemd160').update(sha256Hash).digest(); + } } -exports.sum64_5_hi = sum64_5_hi; -function sum64_5_lo(ah, al, bh, bl, ch, cl, dh, dl, eh, el) { - var lo = al + bl + cl + dl + el; +exports.hash160 = hash160; - return lo >>> 0; +function hmacSHA512(key, data) { + return createHmac('sha512', key).update(data).digest(); } -exports.sum64_5_lo = sum64_5_lo; -function rotr64_hi(ah, al, num) { - var r = (al << (32 - num)) | (ah >>> num); - return r >>> 0; +exports.hmacSHA512 = hmacSHA512; +},{"create-hash":"LF8r","create-hmac":"Cx6S"}],"g2zT":[function(require,module,exports) { +'use strict' +// base-x encoding / decoding +// Copyright (c) 2018 base-x contributors +// Copyright (c) 2014-2018 The Bitcoin Core developers (base58.cpp) +// Distributed under the MIT software license, see the accompanying +// file LICENSE or http://www.opensource.org/licenses/mit-license.php. +// @ts-ignore +var _Buffer = require('safe-buffer').Buffer +function base (ALPHABET) { + if (ALPHABET.length >= 255) { throw new TypeError('Alphabet too long') } + var BASE_MAP = new Uint8Array(256) + BASE_MAP.fill(255) + for (var i = 0; i < ALPHABET.length; i++) { + var x = ALPHABET.charAt(i) + var xc = x.charCodeAt(0) + if (BASE_MAP[xc] !== 255) { throw new TypeError(x + ' is ambiguous') } + BASE_MAP[xc] = i + } + var BASE = ALPHABET.length + var LEADER = ALPHABET.charAt(0) + var FACTOR = Math.log(BASE) / Math.log(256) // log(BASE) / log(256), rounded up + var iFACTOR = Math.log(256) / Math.log(BASE) // log(256) / log(BASE), rounded up + function encode (source) { + if (!_Buffer.isBuffer(source)) { throw new TypeError('Expected Buffer') } + if (source.length === 0) { return '' } + // Skip & count leading zeroes. + var zeroes = 0 + var length = 0 + var pbegin = 0 + var pend = source.length + while (pbegin !== pend && source[pbegin] === 0) { + pbegin++ + zeroes++ + } + // Allocate enough space in big-endian base58 representation. + var size = ((pend - pbegin) * iFACTOR + 1) >>> 0 + var b58 = new Uint8Array(size) + // Process the bytes. + while (pbegin !== pend) { + var carry = source[pbegin] + // Apply "b58 = b58 * 256 + ch". + var i = 0 + for (var it1 = size - 1; (carry !== 0 || i < length) && (it1 !== -1); it1--, i++) { + carry += (256 * b58[it1]) >>> 0 + b58[it1] = (carry % BASE) >>> 0 + carry = (carry / BASE) >>> 0 + } + if (carry !== 0) { throw new Error('Non-zero carry') } + length = i + pbegin++ + } + // Skip leading zeroes in base58 result. + var it2 = size - length + while (it2 !== size && b58[it2] === 0) { + it2++ + } + // Translate the result into a string. + var str = LEADER.repeat(zeroes) + for (; it2 < size; ++it2) { str += ALPHABET.charAt(b58[it2]) } + return str + } + function decodeUnsafe (source) { + if (typeof source !== 'string') { throw new TypeError('Expected String') } + if (source.length === 0) { return _Buffer.alloc(0) } + var psz = 0 + // Skip leading spaces. + if (source[psz] === ' ') { return } + // Skip and count leading '1's. + var zeroes = 0 + var length = 0 + while (source[psz] === LEADER) { + zeroes++ + psz++ + } + // Allocate enough space in big-endian base256 representation. + var size = (((source.length - psz) * FACTOR) + 1) >>> 0 // log(58) / log(256), rounded up. + var b256 = new Uint8Array(size) + // Process the characters. + while (source[psz]) { + // Decode character + var carry = BASE_MAP[source.charCodeAt(psz)] + // Invalid character + if (carry === 255) { return } + var i = 0 + for (var it3 = size - 1; (carry !== 0 || i < length) && (it3 !== -1); it3--, i++) { + carry += (BASE * b256[it3]) >>> 0 + b256[it3] = (carry % 256) >>> 0 + carry = (carry / 256) >>> 0 + } + if (carry !== 0) { throw new Error('Non-zero carry') } + length = i + psz++ + } + // Skip trailing spaces. + if (source[psz] === ' ') { return } + // Skip leading zeroes in b256. + var it4 = size - length + while (it4 !== size && b256[it4] === 0) { + it4++ + } + var vch = _Buffer.allocUnsafe(zeroes + (size - it4)) + vch.fill(0x00, 0, zeroes) + var j = zeroes + while (it4 !== size) { + vch[j++] = b256[it4++] + } + return vch + } + function decode (string) { + var buffer = decodeUnsafe(string) + if (buffer) { return buffer } + throw new Error('Non-base' + BASE + ' character') + } + return { + encode: encode, + decodeUnsafe: decodeUnsafe, + decode: decode + } } -exports.rotr64_hi = rotr64_hi; +module.exports = base -function rotr64_lo(ah, al, num) { - var r = (ah << (32 - num)) | (al >>> num); - return r >>> 0; -} -exports.rotr64_lo = rotr64_lo; +},{"safe-buffer":"Wugr"}],"GtuF":[function(require,module,exports) { +var basex = require('base-x') +var ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' -function shr64_hi(ah, al, num) { - return ah >>> num; -} -exports.shr64_hi = shr64_hi; +module.exports = basex(ALPHABET) -function shr64_lo(ah, al, num) { - var r = (ah << (32 - num)) | (al >>> num); - return r >>> 0; -} -exports.shr64_lo = shr64_lo; +},{"base-x":"g2zT"}],"XHF5":[function(require,module,exports) { -},{"minimalistic-assert":"MpuC","inherits":"Bm0n"}],"p0gz":[function(require,module,exports) { -'use strict'; +'use strict' -var utils = require('./utils'); -var assert = require('minimalistic-assert'); +var base58 = require('bs58') +var Buffer = require('safe-buffer').Buffer -function BlockHash() { - this.pending = null; - this.pendingTotal = 0; - this.blockSize = this.constructor.blockSize; - this.outSize = this.constructor.outSize; - this.hmacStrength = this.constructor.hmacStrength; - this.padLength = this.constructor.padLength / 8; - this.endian = 'big'; +module.exports = function (checksumFn) { + // Encode a buffer as a base58-check encoded string + function encode (payload) { + var checksum = checksumFn(payload) - this._delta8 = this.blockSize / 8; - this._delta32 = this.blockSize / 32; -} -exports.BlockHash = BlockHash; + return base58.encode(Buffer.concat([ + payload, + checksum + ], payload.length + 4)) + } -BlockHash.prototype.update = function update(msg, enc) { - // Convert message to array, pad it, and join into 32bit blocks - msg = utils.toArray(msg, enc); - if (!this.pending) - this.pending = msg; - else - this.pending = this.pending.concat(msg); - this.pendingTotal += msg.length; + function decodeRaw (buffer) { + var payload = buffer.slice(0, -4) + var checksum = buffer.slice(-4) + var newChecksum = checksumFn(payload) - // Enough data, try updating - if (this.pending.length >= this._delta8) { - msg = this.pending; + if (checksum[0] ^ newChecksum[0] | + checksum[1] ^ newChecksum[1] | + checksum[2] ^ newChecksum[2] | + checksum[3] ^ newChecksum[3]) return - // Process pending data in blocks - var r = msg.length % this._delta8; - this.pending = msg.slice(msg.length - r, msg.length); - if (this.pending.length === 0) - this.pending = null; + return payload + } - msg = utils.join32(msg, 0, msg.length - r, this.endian); - for (var i = 0; i < msg.length; i += this._delta32) - this._update(msg, i, i + this._delta32); + // Decode a base58-check encoded string to a buffer, no result if checksum is wrong + function decodeUnsafe (string) { + var buffer = base58.decodeUnsafe(string) + if (!buffer) return + + return decodeRaw(buffer) } - return this; -}; + function decode (string) { + var buffer = base58.decode(string) + var payload = decodeRaw(buffer, checksumFn) + if (!payload) throw new Error('Invalid checksum') + return payload + } -BlockHash.prototype.digest = function digest(enc) { - this.update(this._pad()); - assert(this.pending === null); + return { + encode: encode, + decode: decode, + decodeUnsafe: decodeUnsafe + } +} - return this._digest(enc); -}; +},{"bs58":"GtuF","safe-buffer":"Wugr"}],"lJVR":[function(require,module,exports) { +'use strict' -BlockHash.prototype._pad = function pad() { - var len = this.pendingTotal; - var bytes = this._delta8; - var k = bytes - ((len + this.padLength) % bytes); - var res = new Array(k + this.padLength); - res[0] = 0x80; - for (var i = 1; i < k; i++) - res[i] = 0; +var createHash = require('create-hash') +var bs58checkBase = require('./base') - // Append length - len <<= 3; - if (this.endian === 'big') { - for (var t = 8; t < this.padLength; t++) - res[i++] = 0; +// SHA256(SHA256(buffer)) +function sha256x2 (buffer) { + var tmp = createHash('sha256').update(buffer).digest() + return createHash('sha256').update(tmp).digest() +} - res[i++] = 0; - res[i++] = 0; - res[i++] = 0; - res[i++] = 0; - res[i++] = (len >>> 24) & 0xff; - res[i++] = (len >>> 16) & 0xff; - res[i++] = (len >>> 8) & 0xff; - res[i++] = len & 0xff; - } else { - res[i++] = len & 0xff; - res[i++] = (len >>> 8) & 0xff; - res[i++] = (len >>> 16) & 0xff; - res[i++] = (len >>> 24) & 0xff; - res[i++] = 0; - res[i++] = 0; - res[i++] = 0; - res[i++] = 0; +module.exports = bs58checkBase(sha256x2) - for (t = 8; t < this.padLength; t++) - res[i++] = 0; - } +},{"create-hash":"LF8r","./base":"XHF5"}],"BOxy":[function(require,module,exports) { +var Buffer = require("buffer").Buffer; +(function (module, exports) { + 'use strict'; - return res; -}; + // Utils + function assert (val, msg) { + if (!val) throw new Error(msg || 'Assertion failed'); + } -},{"./utils":"eeOV","minimalistic-assert":"MpuC"}],"qR4i":[function(require,module,exports) { -'use strict'; + // Could use `inherits` module, but don't want to move from single file + // architecture yet. + function inherits (ctor, superCtor) { + ctor.super_ = superCtor; + var TempCtor = function () {}; + TempCtor.prototype = superCtor.prototype; + ctor.prototype = new TempCtor(); + ctor.prototype.constructor = ctor; + } -var utils = require('../utils'); -var rotr32 = utils.rotr32; + // BN -function ft_1(s, x, y, z) { - if (s === 0) - return ch32(x, y, z); - if (s === 1 || s === 3) - return p32(x, y, z); - if (s === 2) - return maj32(x, y, z); -} -exports.ft_1 = ft_1; + function BN (number, base, endian) { + if (BN.isBN(number)) { + return number; + } -function ch32(x, y, z) { - return (x & y) ^ ((~x) & z); -} -exports.ch32 = ch32; + this.negative = 0; + this.words = null; + this.length = 0; -function maj32(x, y, z) { - return (x & y) ^ (x & z) ^ (y & z); -} -exports.maj32 = maj32; + // Reduction context + this.red = null; -function p32(x, y, z) { - return x ^ y ^ z; -} -exports.p32 = p32; + if (number !== null) { + if (base === 'le' || base === 'be') { + endian = base; + base = 10; + } -function s0_256(x) { - return rotr32(x, 2) ^ rotr32(x, 13) ^ rotr32(x, 22); -} -exports.s0_256 = s0_256; + this._init(number || 0, base || 10, endian || 'be'); + } + } + if (typeof module === 'object') { + module.exports = BN; + } else { + exports.BN = BN; + } -function s1_256(x) { - return rotr32(x, 6) ^ rotr32(x, 11) ^ rotr32(x, 25); -} -exports.s1_256 = s1_256; + BN.BN = BN; + BN.wordSize = 26; -function g0_256(x) { - return rotr32(x, 7) ^ rotr32(x, 18) ^ (x >>> 3); -} -exports.g0_256 = g0_256; + var Buffer; + try { + Buffer = require('buffer').Buffer; + } catch (e) { + } -function g1_256(x) { - return rotr32(x, 17) ^ rotr32(x, 19) ^ (x >>> 10); -} -exports.g1_256 = g1_256; + BN.isBN = function isBN (num) { + if (num instanceof BN) { + return true; + } -},{"../utils":"eeOV"}],"rIEX":[function(require,module,exports) { -'use strict'; + return num !== null && typeof num === 'object' && + num.constructor.wordSize === BN.wordSize && Array.isArray(num.words); + }; -var utils = require('../utils'); -var common = require('../common'); -var shaCommon = require('./common'); + BN.max = function max (left, right) { + if (left.cmp(right) > 0) return left; + return right; + }; -var rotl32 = utils.rotl32; -var sum32 = utils.sum32; -var sum32_5 = utils.sum32_5; -var ft_1 = shaCommon.ft_1; -var BlockHash = common.BlockHash; + BN.min = function min (left, right) { + if (left.cmp(right) < 0) return left; + return right; + }; -var sha1_K = [ - 0x5A827999, 0x6ED9EBA1, - 0x8F1BBCDC, 0xCA62C1D6 -]; + BN.prototype._init = function init (number, base, endian) { + if (typeof number === 'number') { + return this._initNumber(number, base, endian); + } -function SHA1() { - if (!(this instanceof SHA1)) - return new SHA1(); + if (typeof number === 'object') { + return this._initArray(number, base, endian); + } - BlockHash.call(this); - this.h = [ - 0x67452301, 0xefcdab89, 0x98badcfe, - 0x10325476, 0xc3d2e1f0 ]; - this.W = new Array(80); -} + if (base === 'hex') { + base = 16; + } + assert(base === (base | 0) && base >= 2 && base <= 36); -utils.inherits(SHA1, BlockHash); -module.exports = SHA1; + number = number.toString().replace(/\s+/g, ''); + var start = 0; + if (number[0] === '-') { + start++; + } -SHA1.blockSize = 512; -SHA1.outSize = 160; -SHA1.hmacStrength = 80; -SHA1.padLength = 64; + if (base === 16) { + this._parseHex(number, start); + } else { + this._parseBase(number, base, start); + } -SHA1.prototype._update = function _update(msg, start) { - var W = this.W; + if (number[0] === '-') { + this.negative = 1; + } - for (var i = 0; i < 16; i++) - W[i] = msg[start + i]; + this.strip(); - for(; i < W.length; i++) - W[i] = rotl32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1); + if (endian !== 'le') return; - var a = this.h[0]; - var b = this.h[1]; - var c = this.h[2]; - var d = this.h[3]; - var e = this.h[4]; + this._initArray(this.toArray(), base, endian); + }; - for (i = 0; i < W.length; i++) { - var s = ~~(i / 20); - var t = sum32_5(rotl32(a, 5), ft_1(s, b, c, d), e, W[i], sha1_K[s]); - e = d; - d = c; - c = rotl32(b, 30); - b = a; - a = t; - } + BN.prototype._initNumber = function _initNumber (number, base, endian) { + if (number < 0) { + this.negative = 1; + number = -number; + } + if (number < 0x4000000) { + this.words = [ number & 0x3ffffff ]; + this.length = 1; + } else if (number < 0x10000000000000) { + this.words = [ + number & 0x3ffffff, + (number / 0x4000000) & 0x3ffffff + ]; + this.length = 2; + } else { + assert(number < 0x20000000000000); // 2 ^ 53 (unsafe) + this.words = [ + number & 0x3ffffff, + (number / 0x4000000) & 0x3ffffff, + 1 + ]; + this.length = 3; + } - this.h[0] = sum32(this.h[0], a); - this.h[1] = sum32(this.h[1], b); - this.h[2] = sum32(this.h[2], c); - this.h[3] = sum32(this.h[3], d); - this.h[4] = sum32(this.h[4], e); -}; + if (endian !== 'le') return; -SHA1.prototype._digest = function digest(enc) { - if (enc === 'hex') - return utils.toHex32(this.h, 'big'); - else - return utils.split32(this.h, 'big'); -}; + // Reverse the bytes + this._initArray(this.toArray(), base, endian); + }; -},{"../utils":"eeOV","../common":"p0gz","./common":"qR4i"}],"iJWs":[function(require,module,exports) { -'use strict'; + BN.prototype._initArray = function _initArray (number, base, endian) { + // Perhaps a Uint8Array + assert(typeof number.length === 'number'); + if (number.length <= 0) { + this.words = [ 0 ]; + this.length = 1; + return this; + } -var utils = require('../utils'); -var common = require('../common'); -var shaCommon = require('./common'); -var assert = require('minimalistic-assert'); + this.length = Math.ceil(number.length / 3); + this.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + this.words[i] = 0; + } -var sum32 = utils.sum32; -var sum32_4 = utils.sum32_4; -var sum32_5 = utils.sum32_5; -var ch32 = shaCommon.ch32; -var maj32 = shaCommon.maj32; -var s0_256 = shaCommon.s0_256; -var s1_256 = shaCommon.s1_256; -var g0_256 = shaCommon.g0_256; -var g1_256 = shaCommon.g1_256; + var j, w; + var off = 0; + if (endian === 'be') { + for (i = number.length - 1, j = 0; i >= 0; i -= 3) { + w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16); + this.words[j] |= (w << off) & 0x3ffffff; + this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff; + off += 24; + if (off >= 26) { + off -= 26; + j++; + } + } + } else if (endian === 'le') { + for (i = 0, j = 0; i < number.length; i += 3) { + w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16); + this.words[j] |= (w << off) & 0x3ffffff; + this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff; + off += 24; + if (off >= 26) { + off -= 26; + j++; + } + } + } + return this.strip(); + }; -var BlockHash = common.BlockHash; + function parseHex (str, start, end) { + var r = 0; + var len = Math.min(str.length, end); + for (var i = start; i < len; i++) { + var c = str.charCodeAt(i) - 48; -var sha256_K = [ - 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, - 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, - 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, - 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, - 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, - 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, - 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, - 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, - 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, - 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, - 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, - 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, - 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, - 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, - 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, - 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 -]; + r <<= 4; -function SHA256() { - if (!(this instanceof SHA256)) - return new SHA256(); + // 'a' - 'f' + if (c >= 49 && c <= 54) { + r |= c - 49 + 0xa; - BlockHash.call(this); - this.h = [ - 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, - 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 - ]; - this.k = sha256_K; - this.W = new Array(64); -} -utils.inherits(SHA256, BlockHash); -module.exports = SHA256; + // 'A' - 'F' + } else if (c >= 17 && c <= 22) { + r |= c - 17 + 0xa; -SHA256.blockSize = 512; -SHA256.outSize = 256; -SHA256.hmacStrength = 192; -SHA256.padLength = 64; + // '0' - '9' + } else { + r |= c & 0xf; + } + } + return r; + } -SHA256.prototype._update = function _update(msg, start) { - var W = this.W; + BN.prototype._parseHex = function _parseHex (number, start) { + // Create possibly bigger array to ensure that it fits the number + this.length = Math.ceil((number.length - start) / 6); + this.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + this.words[i] = 0; + } - for (var i = 0; i < 16; i++) - W[i] = msg[start + i]; - for (; i < W.length; i++) - W[i] = sum32_4(g1_256(W[i - 2]), W[i - 7], g0_256(W[i - 15]), W[i - 16]); + var j, w; + // Scan 24-bit chunks and add them to the number + var off = 0; + for (i = number.length - 6, j = 0; i >= start; i -= 6) { + w = parseHex(number, i, i + 6); + this.words[j] |= (w << off) & 0x3ffffff; + // NOTE: `0x3fffff` is intentional here, 26bits max shift + 24bit hex limb + this.words[j + 1] |= w >>> (26 - off) & 0x3fffff; + off += 24; + if (off >= 26) { + off -= 26; + j++; + } + } + if (i + 6 !== start) { + w = parseHex(number, start, i + 6); + this.words[j] |= (w << off) & 0x3ffffff; + this.words[j + 1] |= w >>> (26 - off) & 0x3fffff; + } + this.strip(); + }; - var a = this.h[0]; - var b = this.h[1]; - var c = this.h[2]; - var d = this.h[3]; - var e = this.h[4]; - var f = this.h[5]; - var g = this.h[6]; - var h = this.h[7]; + function parseBase (str, start, end, mul) { + var r = 0; + var len = Math.min(str.length, end); + for (var i = start; i < len; i++) { + var c = str.charCodeAt(i) - 48; - assert(this.k.length === W.length); - for (i = 0; i < W.length; i++) { - var T1 = sum32_5(h, s1_256(e), ch32(e, f, g), this.k[i], W[i]); - var T2 = sum32(s0_256(a), maj32(a, b, c)); - h = g; - g = f; - f = e; - e = sum32(d, T1); - d = c; - c = b; - b = a; - a = sum32(T1, T2); - } + r *= mul; - this.h[0] = sum32(this.h[0], a); - this.h[1] = sum32(this.h[1], b); - this.h[2] = sum32(this.h[2], c); - this.h[3] = sum32(this.h[3], d); - this.h[4] = sum32(this.h[4], e); - this.h[5] = sum32(this.h[5], f); - this.h[6] = sum32(this.h[6], g); - this.h[7] = sum32(this.h[7], h); -}; + // 'a' + if (c >= 49) { + r += c - 49 + 0xa; -SHA256.prototype._digest = function digest(enc) { - if (enc === 'hex') - return utils.toHex32(this.h, 'big'); - else - return utils.split32(this.h, 'big'); -}; + // 'A' + } else if (c >= 17) { + r += c - 17 + 0xa; -},{"../utils":"eeOV","../common":"p0gz","./common":"qR4i","minimalistic-assert":"MpuC"}],"NwVK":[function(require,module,exports) { -'use strict'; + // '0' - '9' + } else { + r += c; + } + } + return r; + } -var utils = require('../utils'); -var SHA256 = require('./256'); + BN.prototype._parseBase = function _parseBase (number, base, start) { + // Initialize as zero + this.words = [ 0 ]; + this.length = 1; -function SHA224() { - if (!(this instanceof SHA224)) - return new SHA224(); + // Find length of limb in base + for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) { + limbLen++; + } + limbLen--; + limbPow = (limbPow / base) | 0; - SHA256.call(this); - this.h = [ - 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, - 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 ]; -} -utils.inherits(SHA224, SHA256); -module.exports = SHA224; + var total = number.length - start; + var mod = total % limbLen; + var end = Math.min(total, total - mod) + start; -SHA224.blockSize = 512; -SHA224.outSize = 224; -SHA224.hmacStrength = 192; -SHA224.padLength = 64; + var word = 0; + for (var i = start; i < end; i += limbLen) { + word = parseBase(number, i, i + limbLen, base); -SHA224.prototype._digest = function digest(enc) { - // Just truncate output - if (enc === 'hex') - return utils.toHex32(this.h.slice(0, 7), 'big'); - else - return utils.split32(this.h.slice(0, 7), 'big'); -}; + this.imuln(limbPow); + if (this.words[0] + word < 0x4000000) { + this.words[0] += word; + } else { + this._iaddn(word); + } + } + if (mod !== 0) { + var pow = 1; + word = parseBase(number, i, number.length, base); -},{"../utils":"eeOV","./256":"iJWs"}],"CY40":[function(require,module,exports) { -'use strict'; + for (i = 0; i < mod; i++) { + pow *= base; + } -var utils = require('../utils'); -var common = require('../common'); -var assert = require('minimalistic-assert'); + this.imuln(pow); + if (this.words[0] + word < 0x4000000) { + this.words[0] += word; + } else { + this._iaddn(word); + } + } + }; -var rotr64_hi = utils.rotr64_hi; -var rotr64_lo = utils.rotr64_lo; -var shr64_hi = utils.shr64_hi; -var shr64_lo = utils.shr64_lo; -var sum64 = utils.sum64; -var sum64_hi = utils.sum64_hi; -var sum64_lo = utils.sum64_lo; -var sum64_4_hi = utils.sum64_4_hi; -var sum64_4_lo = utils.sum64_4_lo; -var sum64_5_hi = utils.sum64_5_hi; -var sum64_5_lo = utils.sum64_5_lo; + BN.prototype.copy = function copy (dest) { + dest.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + dest.words[i] = this.words[i]; + } + dest.length = this.length; + dest.negative = this.negative; + dest.red = this.red; + }; -var BlockHash = common.BlockHash; + BN.prototype.clone = function clone () { + var r = new BN(null); + this.copy(r); + return r; + }; -var sha512_K = [ - 0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd, - 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc, - 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019, - 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118, - 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe, - 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2, - 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1, - 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694, - 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3, - 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65, - 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483, - 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5, - 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210, - 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4, - 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725, - 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70, - 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926, - 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df, - 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8, - 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b, - 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001, - 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30, - 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910, - 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8, - 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53, - 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8, - 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb, - 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3, - 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60, - 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec, - 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9, - 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b, - 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207, - 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178, - 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6, - 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b, - 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493, - 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c, - 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a, - 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817 -]; + BN.prototype._expand = function _expand (size) { + while (this.length < size) { + this.words[this.length++] = 0; + } + return this; + }; -function SHA512() { - if (!(this instanceof SHA512)) - return new SHA512(); + // Remove leading `0` from `this` + BN.prototype.strip = function strip () { + while (this.length > 1 && this.words[this.length - 1] === 0) { + this.length--; + } + return this._normSign(); + }; - BlockHash.call(this); - this.h = [ - 0x6a09e667, 0xf3bcc908, - 0xbb67ae85, 0x84caa73b, - 0x3c6ef372, 0xfe94f82b, - 0xa54ff53a, 0x5f1d36f1, - 0x510e527f, 0xade682d1, - 0x9b05688c, 0x2b3e6c1f, - 0x1f83d9ab, 0xfb41bd6b, - 0x5be0cd19, 0x137e2179 ]; - this.k = sha512_K; - this.W = new Array(160); -} -utils.inherits(SHA512, BlockHash); -module.exports = SHA512; + BN.prototype._normSign = function _normSign () { + // -0 = 0 + if (this.length === 1 && this.words[0] === 0) { + this.negative = 0; + } + return this; + }; -SHA512.blockSize = 1024; -SHA512.outSize = 512; -SHA512.hmacStrength = 192; -SHA512.padLength = 128; + BN.prototype.inspect = function inspect () { + return (this.red ? ''; + }; -SHA512.prototype._prepareBlock = function _prepareBlock(msg, start) { - var W = this.W; + /* - // 32 x 32bit words - for (var i = 0; i < 32; i++) - W[i] = msg[start + i]; - for (; i < W.length; i += 2) { - var c0_hi = g1_512_hi(W[i - 4], W[i - 3]); // i - 2 - var c0_lo = g1_512_lo(W[i - 4], W[i - 3]); - var c1_hi = W[i - 14]; // i - 7 - var c1_lo = W[i - 13]; - var c2_hi = g0_512_hi(W[i - 30], W[i - 29]); // i - 15 - var c2_lo = g0_512_lo(W[i - 30], W[i - 29]); - var c3_hi = W[i - 32]; // i - 16 - var c3_lo = W[i - 31]; + var zeros = []; + var groupSizes = []; + var groupBases = []; - W[i] = sum64_4_hi( - c0_hi, c0_lo, - c1_hi, c1_lo, - c2_hi, c2_lo, - c3_hi, c3_lo); - W[i + 1] = sum64_4_lo( - c0_hi, c0_lo, - c1_hi, c1_lo, - c2_hi, c2_lo, - c3_hi, c3_lo); + var s = ''; + var i = -1; + while (++i < BN.wordSize) { + zeros[i] = s; + s += '0'; + } + groupSizes[0] = 0; + groupSizes[1] = 0; + groupBases[0] = 0; + groupBases[1] = 0; + var base = 2 - 1; + while (++base < 36 + 1) { + var groupSize = 0; + var groupBase = 1; + while (groupBase < (1 << BN.wordSize) / base) { + groupBase *= base; + groupSize += 1; + } + groupSizes[base] = groupSize; + groupBases[base] = groupBase; } -}; -SHA512.prototype._update = function _update(msg, start) { - this._prepareBlock(msg, start); + */ - var W = this.W; + var zeros = [ + '', + '0', + '00', + '000', + '0000', + '00000', + '000000', + '0000000', + '00000000', + '000000000', + '0000000000', + '00000000000', + '000000000000', + '0000000000000', + '00000000000000', + '000000000000000', + '0000000000000000', + '00000000000000000', + '000000000000000000', + '0000000000000000000', + '00000000000000000000', + '000000000000000000000', + '0000000000000000000000', + '00000000000000000000000', + '000000000000000000000000', + '0000000000000000000000000' + ]; - var ah = this.h[0]; - var al = this.h[1]; - var bh = this.h[2]; - var bl = this.h[3]; - var ch = this.h[4]; - var cl = this.h[5]; - var dh = this.h[6]; - var dl = this.h[7]; - var eh = this.h[8]; - var el = this.h[9]; - var fh = this.h[10]; - var fl = this.h[11]; - var gh = this.h[12]; - var gl = this.h[13]; - var hh = this.h[14]; - var hl = this.h[15]; + var groupSizes = [ + 0, 0, + 25, 16, 12, 11, 10, 9, 8, + 8, 7, 7, 7, 7, 6, 6, + 6, 6, 6, 6, 6, 5, 5, + 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5 + ]; - assert(this.k.length === W.length); - for (var i = 0; i < W.length; i += 2) { - var c0_hi = hh; - var c0_lo = hl; - var c1_hi = s1_512_hi(eh, el); - var c1_lo = s1_512_lo(eh, el); - var c2_hi = ch64_hi(eh, el, fh, fl, gh, gl); - var c2_lo = ch64_lo(eh, el, fh, fl, gh, gl); - var c3_hi = this.k[i]; - var c3_lo = this.k[i + 1]; - var c4_hi = W[i]; - var c4_lo = W[i + 1]; + var groupBases = [ + 0, 0, + 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216, + 43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625, + 16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632, + 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149, + 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176 + ]; - var T1_hi = sum64_5_hi( - c0_hi, c0_lo, - c1_hi, c1_lo, - c2_hi, c2_lo, - c3_hi, c3_lo, - c4_hi, c4_lo); - var T1_lo = sum64_5_lo( - c0_hi, c0_lo, - c1_hi, c1_lo, - c2_hi, c2_lo, - c3_hi, c3_lo, - c4_hi, c4_lo); + BN.prototype.toString = function toString (base, padding) { + base = base || 10; + padding = padding | 0 || 1; - c0_hi = s0_512_hi(ah, al); - c0_lo = s0_512_lo(ah, al); - c1_hi = maj64_hi(ah, al, bh, bl, ch, cl); - c1_lo = maj64_lo(ah, al, bh, bl, ch, cl); + var out; + if (base === 16 || base === 'hex') { + out = ''; + var off = 0; + var carry = 0; + for (var i = 0; i < this.length; i++) { + var w = this.words[i]; + var word = (((w << off) | carry) & 0xffffff).toString(16); + carry = (w >>> (24 - off)) & 0xffffff; + if (carry !== 0 || i !== this.length - 1) { + out = zeros[6 - word.length] + word + out; + } else { + out = word + out; + } + off += 2; + if (off >= 26) { + off -= 26; + i--; + } + } + if (carry !== 0) { + out = carry.toString(16) + out; + } + while (out.length % padding !== 0) { + out = '0' + out; + } + if (this.negative !== 0) { + out = '-' + out; + } + return out; + } - var T2_hi = sum64_hi(c0_hi, c0_lo, c1_hi, c1_lo); - var T2_lo = sum64_lo(c0_hi, c0_lo, c1_hi, c1_lo); + if (base === (base | 0) && base >= 2 && base <= 36) { + // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base)); + var groupSize = groupSizes[base]; + // var groupBase = Math.pow(base, groupSize); + var groupBase = groupBases[base]; + out = ''; + var c = this.clone(); + c.negative = 0; + while (!c.isZero()) { + var r = c.modn(groupBase).toString(base); + c = c.idivn(groupBase); - hh = gh; - hl = gl; + if (!c.isZero()) { + out = zeros[groupSize - r.length] + r + out; + } else { + out = r + out; + } + } + if (this.isZero()) { + out = '0' + out; + } + while (out.length % padding !== 0) { + out = '0' + out; + } + if (this.negative !== 0) { + out = '-' + out; + } + return out; + } - gh = fh; - gl = fl; + assert(false, 'Base should be between 2 and 36'); + }; - fh = eh; - fl = el; + BN.prototype.toNumber = function toNumber () { + var ret = this.words[0]; + if (this.length === 2) { + ret += this.words[1] * 0x4000000; + } else if (this.length === 3 && this.words[2] === 0x01) { + // NOTE: at this stage it is known that the top bit is set + ret += 0x10000000000000 + (this.words[1] * 0x4000000); + } else if (this.length > 2) { + assert(false, 'Number can only safely store up to 53 bits'); + } + return (this.negative !== 0) ? -ret : ret; + }; - eh = sum64_hi(dh, dl, T1_hi, T1_lo); - el = sum64_lo(dl, dl, T1_hi, T1_lo); + BN.prototype.toJSON = function toJSON () { + return this.toString(16); + }; - dh = ch; - dl = cl; + BN.prototype.toBuffer = function toBuffer (endian, length) { + assert(typeof Buffer !== 'undefined'); + return this.toArrayLike(Buffer, endian, length); + }; - ch = bh; - cl = bl; + BN.prototype.toArray = function toArray (endian, length) { + return this.toArrayLike(Array, endian, length); + }; - bh = ah; - bl = al; + BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) { + var byteLength = this.byteLength(); + var reqLength = length || Math.max(1, byteLength); + assert(byteLength <= reqLength, 'byte array longer than desired length'); + assert(reqLength > 0, 'Requested array length <= 0'); - ah = sum64_hi(T1_hi, T1_lo, T2_hi, T2_lo); - al = sum64_lo(T1_hi, T1_lo, T2_hi, T2_lo); - } + this.strip(); + var littleEndian = endian === 'le'; + var res = new ArrayType(reqLength); - sum64(this.h, 0, ah, al); - sum64(this.h, 2, bh, bl); - sum64(this.h, 4, ch, cl); - sum64(this.h, 6, dh, dl); - sum64(this.h, 8, eh, el); - sum64(this.h, 10, fh, fl); - sum64(this.h, 12, gh, gl); - sum64(this.h, 14, hh, hl); -}; + var b, i; + var q = this.clone(); + if (!littleEndian) { + // Assume big-endian + for (i = 0; i < reqLength - byteLength; i++) { + res[i] = 0; + } -SHA512.prototype._digest = function digest(enc) { - if (enc === 'hex') - return utils.toHex32(this.h, 'big'); - else - return utils.split32(this.h, 'big'); -}; + for (i = 0; !q.isZero(); i++) { + b = q.andln(0xff); + q.iushrn(8); -function ch64_hi(xh, xl, yh, yl, zh) { - var r = (xh & yh) ^ ((~xh) & zh); - if (r < 0) - r += 0x100000000; - return r; -} + res[reqLength - i - 1] = b; + } + } else { + for (i = 0; !q.isZero(); i++) { + b = q.andln(0xff); + q.iushrn(8); -function ch64_lo(xh, xl, yh, yl, zh, zl) { - var r = (xl & yl) ^ ((~xl) & zl); - if (r < 0) - r += 0x100000000; - return r; -} + res[i] = b; + } -function maj64_hi(xh, xl, yh, yl, zh) { - var r = (xh & yh) ^ (xh & zh) ^ (yh & zh); - if (r < 0) - r += 0x100000000; - return r; -} + for (; i < reqLength; i++) { + res[i] = 0; + } + } -function maj64_lo(xh, xl, yh, yl, zh, zl) { - var r = (xl & yl) ^ (xl & zl) ^ (yl & zl); - if (r < 0) - r += 0x100000000; - return r; -} + return res; + }; -function s0_512_hi(xh, xl) { - var c0_hi = rotr64_hi(xh, xl, 28); - var c1_hi = rotr64_hi(xl, xh, 2); // 34 - var c2_hi = rotr64_hi(xl, xh, 7); // 39 + if (Math.clz32) { + BN.prototype._countBits = function _countBits (w) { + return 32 - Math.clz32(w); + }; + } else { + BN.prototype._countBits = function _countBits (w) { + var t = w; + var r = 0; + if (t >= 0x1000) { + r += 13; + t >>>= 13; + } + if (t >= 0x40) { + r += 7; + t >>>= 7; + } + if (t >= 0x8) { + r += 4; + t >>>= 4; + } + if (t >= 0x02) { + r += 2; + t >>>= 2; + } + return r + t; + }; + } - var r = c0_hi ^ c1_hi ^ c2_hi; - if (r < 0) - r += 0x100000000; - return r; -} + BN.prototype._zeroBits = function _zeroBits (w) { + // Short-cut + if (w === 0) return 26; -function s0_512_lo(xh, xl) { - var c0_lo = rotr64_lo(xh, xl, 28); - var c1_lo = rotr64_lo(xl, xh, 2); // 34 - var c2_lo = rotr64_lo(xl, xh, 7); // 39 + var t = w; + var r = 0; + if ((t & 0x1fff) === 0) { + r += 13; + t >>>= 13; + } + if ((t & 0x7f) === 0) { + r += 7; + t >>>= 7; + } + if ((t & 0xf) === 0) { + r += 4; + t >>>= 4; + } + if ((t & 0x3) === 0) { + r += 2; + t >>>= 2; + } + if ((t & 0x1) === 0) { + r++; + } + return r; + }; - var r = c0_lo ^ c1_lo ^ c2_lo; - if (r < 0) - r += 0x100000000; - return r; -} + // Return number of used bits in a BN + BN.prototype.bitLength = function bitLength () { + var w = this.words[this.length - 1]; + var hi = this._countBits(w); + return (this.length - 1) * 26 + hi; + }; -function s1_512_hi(xh, xl) { - var c0_hi = rotr64_hi(xh, xl, 14); - var c1_hi = rotr64_hi(xh, xl, 18); - var c2_hi = rotr64_hi(xl, xh, 9); // 41 + function toBitArray (num) { + var w = new Array(num.bitLength()); - var r = c0_hi ^ c1_hi ^ c2_hi; - if (r < 0) - r += 0x100000000; - return r; -} + for (var bit = 0; bit < w.length; bit++) { + var off = (bit / 26) | 0; + var wbit = bit % 26; -function s1_512_lo(xh, xl) { - var c0_lo = rotr64_lo(xh, xl, 14); - var c1_lo = rotr64_lo(xh, xl, 18); - var c2_lo = rotr64_lo(xl, xh, 9); // 41 + w[bit] = (num.words[off] & (1 << wbit)) >>> wbit; + } - var r = c0_lo ^ c1_lo ^ c2_lo; - if (r < 0) - r += 0x100000000; - return r; -} + return w; + } -function g0_512_hi(xh, xl) { - var c0_hi = rotr64_hi(xh, xl, 1); - var c1_hi = rotr64_hi(xh, xl, 8); - var c2_hi = shr64_hi(xh, xl, 7); + // Number of trailing zero bits + BN.prototype.zeroBits = function zeroBits () { + if (this.isZero()) return 0; - var r = c0_hi ^ c1_hi ^ c2_hi; - if (r < 0) - r += 0x100000000; - return r; -} + var r = 0; + for (var i = 0; i < this.length; i++) { + var b = this._zeroBits(this.words[i]); + r += b; + if (b !== 26) break; + } + return r; + }; -function g0_512_lo(xh, xl) { - var c0_lo = rotr64_lo(xh, xl, 1); - var c1_lo = rotr64_lo(xh, xl, 8); - var c2_lo = shr64_lo(xh, xl, 7); + BN.prototype.byteLength = function byteLength () { + return Math.ceil(this.bitLength() / 8); + }; - var r = c0_lo ^ c1_lo ^ c2_lo; - if (r < 0) - r += 0x100000000; - return r; -} + BN.prototype.toTwos = function toTwos (width) { + if (this.negative !== 0) { + return this.abs().inotn(width).iaddn(1); + } + return this.clone(); + }; -function g1_512_hi(xh, xl) { - var c0_hi = rotr64_hi(xh, xl, 19); - var c1_hi = rotr64_hi(xl, xh, 29); // 61 - var c2_hi = shr64_hi(xh, xl, 6); + BN.prototype.fromTwos = function fromTwos (width) { + if (this.testn(width - 1)) { + return this.notn(width).iaddn(1).ineg(); + } + return this.clone(); + }; - var r = c0_hi ^ c1_hi ^ c2_hi; - if (r < 0) - r += 0x100000000; - return r; -} + BN.prototype.isNeg = function isNeg () { + return this.negative !== 0; + }; -function g1_512_lo(xh, xl) { - var c0_lo = rotr64_lo(xh, xl, 19); - var c1_lo = rotr64_lo(xl, xh, 29); // 61 - var c2_lo = shr64_lo(xh, xl, 6); + // Return negative clone of `this` + BN.prototype.neg = function neg () { + return this.clone().ineg(); + }; - var r = c0_lo ^ c1_lo ^ c2_lo; - if (r < 0) - r += 0x100000000; - return r; -} + BN.prototype.ineg = function ineg () { + if (!this.isZero()) { + this.negative ^= 1; + } -},{"../utils":"eeOV","../common":"p0gz","minimalistic-assert":"MpuC"}],"sAVb":[function(require,module,exports) { -'use strict'; + return this; + }; -var utils = require('../utils'); + // Or `num` with `this` in-place + BN.prototype.iuor = function iuor (num) { + while (this.length < num.length) { + this.words[this.length++] = 0; + } -var SHA512 = require('./512'); + for (var i = 0; i < num.length; i++) { + this.words[i] = this.words[i] | num.words[i]; + } -function SHA384() { - if (!(this instanceof SHA384)) - return new SHA384(); + return this.strip(); + }; - SHA512.call(this); - this.h = [ - 0xcbbb9d5d, 0xc1059ed8, - 0x629a292a, 0x367cd507, - 0x9159015a, 0x3070dd17, - 0x152fecd8, 0xf70e5939, - 0x67332667, 0xffc00b31, - 0x8eb44a87, 0x68581511, - 0xdb0c2e0d, 0x64f98fa7, - 0x47b5481d, 0xbefa4fa4 ]; -} -utils.inherits(SHA384, SHA512); -module.exports = SHA384; + BN.prototype.ior = function ior (num) { + assert((this.negative | num.negative) === 0); + return this.iuor(num); + }; -SHA384.blockSize = 1024; -SHA384.outSize = 384; -SHA384.hmacStrength = 192; -SHA384.padLength = 128; + // Or `num` with `this` + BN.prototype.or = function or (num) { + if (this.length > num.length) return this.clone().ior(num); + return num.clone().ior(this); + }; -SHA384.prototype._digest = function digest(enc) { - if (enc === 'hex') - return utils.toHex32(this.h.slice(0, 12), 'big'); - else - return utils.split32(this.h.slice(0, 12), 'big'); -}; + BN.prototype.uor = function uor (num) { + if (this.length > num.length) return this.clone().iuor(num); + return num.clone().iuor(this); + }; -},{"../utils":"eeOV","./512":"CY40"}],"BhcK":[function(require,module,exports) { -'use strict'; + // And `num` with `this` in-place + BN.prototype.iuand = function iuand (num) { + // b = min-length(num, this) + var b; + if (this.length > num.length) { + b = num; + } else { + b = this; + } -exports.sha1 = require('./sha/1'); -exports.sha224 = require('./sha/224'); -exports.sha256 = require('./sha/256'); -exports.sha384 = require('./sha/384'); -exports.sha512 = require('./sha/512'); + for (var i = 0; i < b.length; i++) { + this.words[i] = this.words[i] & num.words[i]; + } -},{"./sha/1":"rIEX","./sha/224":"NwVK","./sha/256":"iJWs","./sha/384":"sAVb","./sha/512":"CY40"}],"tE3w":[function(require,module,exports) { -'use strict'; + this.length = b.length; -var utils = require('./utils'); -var common = require('./common'); + return this.strip(); + }; -var rotl32 = utils.rotl32; -var sum32 = utils.sum32; -var sum32_3 = utils.sum32_3; -var sum32_4 = utils.sum32_4; -var BlockHash = common.BlockHash; + BN.prototype.iand = function iand (num) { + assert((this.negative | num.negative) === 0); + return this.iuand(num); + }; -function RIPEMD160() { - if (!(this instanceof RIPEMD160)) - return new RIPEMD160(); + // And `num` with `this` + BN.prototype.and = function and (num) { + if (this.length > num.length) return this.clone().iand(num); + return num.clone().iand(this); + }; - BlockHash.call(this); + BN.prototype.uand = function uand (num) { + if (this.length > num.length) return this.clone().iuand(num); + return num.clone().iuand(this); + }; - this.h = [ 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 ]; - this.endian = 'little'; -} -utils.inherits(RIPEMD160, BlockHash); -exports.ripemd160 = RIPEMD160; + // Xor `num` with `this` in-place + BN.prototype.iuxor = function iuxor (num) { + // a.length > b.length + var a; + var b; + if (this.length > num.length) { + a = this; + b = num; + } else { + a = num; + b = this; + } -RIPEMD160.blockSize = 512; -RIPEMD160.outSize = 160; -RIPEMD160.hmacStrength = 192; -RIPEMD160.padLength = 64; + for (var i = 0; i < b.length; i++) { + this.words[i] = a.words[i] ^ b.words[i]; + } -RIPEMD160.prototype._update = function update(msg, start) { - var A = this.h[0]; - var B = this.h[1]; - var C = this.h[2]; - var D = this.h[3]; - var E = this.h[4]; - var Ah = A; - var Bh = B; - var Ch = C; - var Dh = D; - var Eh = E; - for (var j = 0; j < 80; j++) { - var T = sum32( - rotl32( - sum32_4(A, f(j, B, C, D), msg[r[j] + start], K(j)), - s[j]), - E); - A = E; - E = D; - D = rotl32(C, 10); - C = B; - B = T; - T = sum32( - rotl32( - sum32_4(Ah, f(79 - j, Bh, Ch, Dh), msg[rh[j] + start], Kh(j)), - sh[j]), - Eh); - Ah = Eh; - Eh = Dh; - Dh = rotl32(Ch, 10); - Ch = Bh; - Bh = T; - } - T = sum32_3(this.h[1], C, Dh); - this.h[1] = sum32_3(this.h[2], D, Eh); - this.h[2] = sum32_3(this.h[3], E, Ah); - this.h[3] = sum32_3(this.h[4], A, Bh); - this.h[4] = sum32_3(this.h[0], B, Ch); - this.h[0] = T; -}; + if (this !== a) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } -RIPEMD160.prototype._digest = function digest(enc) { - if (enc === 'hex') - return utils.toHex32(this.h, 'little'); - else - return utils.split32(this.h, 'little'); -}; + this.length = a.length; -function f(j, x, y, z) { - if (j <= 15) - return x ^ y ^ z; - else if (j <= 31) - return (x & y) | ((~x) & z); - else if (j <= 47) - return (x | (~y)) ^ z; - else if (j <= 63) - return (x & z) | (y & (~z)); - else - return x ^ (y | (~z)); -} + return this.strip(); + }; -function K(j) { - if (j <= 15) - return 0x00000000; - else if (j <= 31) - return 0x5a827999; - else if (j <= 47) - return 0x6ed9eba1; - else if (j <= 63) - return 0x8f1bbcdc; - else - return 0xa953fd4e; -} + BN.prototype.ixor = function ixor (num) { + assert((this.negative | num.negative) === 0); + return this.iuxor(num); + }; -function Kh(j) { - if (j <= 15) - return 0x50a28be6; - else if (j <= 31) - return 0x5c4dd124; - else if (j <= 47) - return 0x6d703ef3; - else if (j <= 63) - return 0x7a6d76e9; - else - return 0x00000000; -} + // Xor `num` with `this` + BN.prototype.xor = function xor (num) { + if (this.length > num.length) return this.clone().ixor(num); + return num.clone().ixor(this); + }; -var r = [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, - 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, - 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, - 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13 -]; + BN.prototype.uxor = function uxor (num) { + if (this.length > num.length) return this.clone().iuxor(num); + return num.clone().iuxor(this); + }; -var rh = [ - 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, - 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, - 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, - 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, - 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11 -]; + // Not ``this`` with ``width`` bitwidth + BN.prototype.inotn = function inotn (width) { + assert(typeof width === 'number' && width >= 0); -var s = [ - 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, - 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, - 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, - 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, - 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 -]; + var bytesNeeded = Math.ceil(width / 26) | 0; + var bitsLeft = width % 26; -var sh = [ - 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, - 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, - 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, - 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, - 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 -]; + // Extend the buffer with leading zeroes + this._expand(bytesNeeded); -},{"./utils":"eeOV","./common":"p0gz"}],"AA3E":[function(require,module,exports) { -'use strict'; + if (bitsLeft > 0) { + bytesNeeded--; + } -var utils = require('./utils'); -var assert = require('minimalistic-assert'); + // Handle complete words + for (var i = 0; i < bytesNeeded; i++) { + this.words[i] = ~this.words[i] & 0x3ffffff; + } -function Hmac(hash, key, enc) { - if (!(this instanceof Hmac)) - return new Hmac(hash, key, enc); - this.Hash = hash; - this.blockSize = hash.blockSize / 8; - this.outSize = hash.outSize / 8; - this.inner = null; - this.outer = null; + // Handle the residue + if (bitsLeft > 0) { + this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft)); + } - this._init(utils.toArray(key, enc)); -} -module.exports = Hmac; + // And remove leading zeroes + return this.strip(); + }; -Hmac.prototype._init = function init(key) { - // Shorten key, if needed - if (key.length > this.blockSize) - key = new this.Hash().update(key).digest(); - assert(key.length <= this.blockSize); + BN.prototype.notn = function notn (width) { + return this.clone().inotn(width); + }; - // Add padding to key - for (var i = key.length; i < this.blockSize; i++) - key.push(0); + // Set `bit` of `this` + BN.prototype.setn = function setn (bit, val) { + assert(typeof bit === 'number' && bit >= 0); - for (i = 0; i < key.length; i++) - key[i] ^= 0x36; - this.inner = new this.Hash().update(key); + var off = (bit / 26) | 0; + var wbit = bit % 26; - // 0x36 ^ 0x5c = 0x6a - for (i = 0; i < key.length; i++) - key[i] ^= 0x6a; - this.outer = new this.Hash().update(key); -}; + this._expand(off + 1); -Hmac.prototype.update = function update(msg, enc) { - this.inner.update(msg, enc); - return this; -}; + if (val) { + this.words[off] = this.words[off] | (1 << wbit); + } else { + this.words[off] = this.words[off] & ~(1 << wbit); + } -Hmac.prototype.digest = function digest(enc) { - this.outer.update(this.inner.digest()); - return this.outer.digest(enc); -}; + return this.strip(); + }; -},{"./utils":"eeOV","minimalistic-assert":"MpuC"}],"fVGI":[function(require,module,exports) { -var hash = exports; + // Add `num` to `this` in-place + BN.prototype.iadd = function iadd (num) { + var r; -hash.utils = require('./hash/utils'); -hash.common = require('./hash/common'); -hash.sha = require('./hash/sha'); -hash.ripemd = require('./hash/ripemd'); -hash.hmac = require('./hash/hmac'); + // negative + positive + if (this.negative !== 0 && num.negative === 0) { + this.negative = 0; + r = this.isub(num); + this.negative ^= 1; + return this._normSign(); -// Proxy hash functions to the main object -hash.sha1 = hash.sha.sha1; -hash.sha256 = hash.sha.sha256; -hash.sha224 = hash.sha.sha224; -hash.sha384 = hash.sha.sha384; -hash.sha512 = hash.sha.sha512; -hash.ripemd160 = hash.ripemd.ripemd160; + // positive + negative + } else if (this.negative === 0 && num.negative !== 0) { + num.negative = 0; + r = this.isub(num); + num.negative = 1; + return r._normSign(); + } -},{"./hash/utils":"eeOV","./hash/common":"p0gz","./hash/sha":"BhcK","./hash/ripemd":"tE3w","./hash/hmac":"AA3E"}],"khx4":[function(require,module,exports) { -module.exports = { - doubles: { - step: 4, - points: [ - [ - 'e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a', - 'f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821' - ], - [ - '8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508', - '11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf' - ], - [ - '175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739', - 'd3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695' - ], - [ - '363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640', - '4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9' - ], - [ - '8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c', - '4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36' - ], - [ - '723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda', - '96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f' - ], - [ - 'eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa', - '5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999' - ], - [ - '100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0', - 'cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09' - ], - [ - 'e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d', - '9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d' - ], - [ - 'feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d', - 'e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088' - ], - [ - 'da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1', - '9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d' - ], - [ - '53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0', - '5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8' - ], - [ - '8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047', - '10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a' - ], - [ - '385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862', - '283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453' - ], - [ - '6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7', - '7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160' - ], - [ - '3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd', - '56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0' - ], - [ - '85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83', - '7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6' - ], - [ - '948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a', - '53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589' - ], - [ - '6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8', - 'bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17' - ], - [ - 'e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d', - '4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda' - ], - [ - 'e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725', - '7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd' - ], - [ - '213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754', - '4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2' - ], - [ - '4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c', - '17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6' - ], - [ - 'fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6', - '6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f' - ], - [ - '76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39', - 'c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01' - ], - [ - 'c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891', - '893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3' - ], - [ - 'd895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b', - 'febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f' - ], - [ - 'b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03', - '2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7' - ], - [ - 'e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d', - 'eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78' - ], - [ - 'a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070', - '7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1' - ], - [ - '90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4', - 'e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150' - ], - [ - '8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da', - '662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82' - ], - [ - 'e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11', - '1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc' - ], - [ - '8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e', - 'efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b' - ], - [ - 'e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41', - '2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51' - ], - [ - 'b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef', - '67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45' - ], - [ - 'd68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8', - 'db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120' - ], - [ - '324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d', - '648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84' - ], - [ - '4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96', - '35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d' - ], - [ - '9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd', - 'ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d' - ], - [ - '6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5', - '9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8' - ], - [ - 'a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266', - '40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8' - ], - [ - '7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71', - '34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac' - ], - [ - '928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac', - 'c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f' - ], - [ - '85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751', - '1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962' - ], - [ - 'ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e', - '493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907' - ], - [ - '827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241', - 'c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec' - ], - [ - 'eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3', - 'be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d' - ], - [ - 'e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f', - '4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414' - ], - [ - '1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19', - 'aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd' - ], - [ - '146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be', - 'b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0' - ], - [ - 'fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9', - '6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811' - ], - [ - 'da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2', - '8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1' - ], - [ - 'a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13', - '7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c' - ], - [ - '174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c', - 'ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73' - ], - [ - '959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba', - '2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd' - ], - [ - 'd2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151', - 'e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405' - ], - [ - '64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073', - 'd99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589' - ], - [ - '8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458', - '38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e' - ], - [ - '13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b', - '69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27' - ], - [ - 'bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366', - 'd3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1' - ], - [ - '8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa', - '40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482' - ], - [ - '8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0', - '620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945' - ], - [ - 'dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787', - '7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573' - ], - [ - 'f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e', - 'ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82' - ] - ] - }, - naf: { - wnd: 7, - points: [ - [ - 'f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9', - '388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672' - ], - [ - '2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4', - 'd8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6' - ], - [ - '5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc', - '6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da' - ], - [ - 'acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe', - 'cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37' - ], - [ - '774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb', - 'd984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b' - ], - [ - 'f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8', - 'ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81' - ], - [ - 'd7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e', - '581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58' - ], - [ - 'defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34', - '4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77' - ], - [ - '2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c', - '85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a' - ], - [ - '352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5', - '321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c' - ], - [ - '2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f', - '2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67' - ], - [ - '9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714', - '73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402' - ], - [ - 'daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729', - 'a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55' - ], - [ - 'c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db', - '2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482' - ], - [ - '6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4', - 'e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82' - ], - [ - '1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5', - 'b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396' - ], - [ - '605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479', - '2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49' - ], - [ - '62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d', - '80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf' - ], - [ - '80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f', - '1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a' - ], - [ - '7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb', - 'd0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7' - ], - [ - 'd528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9', - 'eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933' - ], - [ - '49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963', - '758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a' - ], - [ - '77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74', - '958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6' - ], - [ - 'f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530', - 'e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37' - ], - [ - '463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b', - '5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e' - ], - [ - 'f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247', - 'cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6' - ], - [ - 'caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1', - 'cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476' - ], - [ - '2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120', - '4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40' - ], - [ - '7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435', - '91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61' - ], - [ - '754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18', - '673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683' - ], - [ - 'e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8', - '59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5' - ], - [ - '186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb', - '3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b' - ], - [ - 'df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f', - '55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417' - ], - [ - '5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143', - 'efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868' - ], - [ - '290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba', - 'e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a' - ], - [ - 'af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45', - 'f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6' - ], - [ - '766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a', - '744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996' - ], - [ - '59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e', - 'c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e' - ], - [ - 'f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8', - 'e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d' - ], - [ - '7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c', - '30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2' - ], - [ - '948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519', - 'e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e' - ], - [ - '7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab', - '100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437' - ], - [ - '3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca', - 'ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311' - ], - [ - 'd3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf', - '8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4' - ], - [ - '1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610', - '68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575' - ], - [ - '733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4', - 'f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d' - ], - [ - '15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c', - 'd56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d' - ], - [ - 'a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940', - 'edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629' - ], - [ - 'e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980', - 'a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06' - ], - [ - '311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3', - '66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374' - ], - [ - '34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf', - '9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee' - ], - [ - 'f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63', - '4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1' - ], - [ - 'd7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448', - 'fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b' - ], - [ - '32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf', - '5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661' - ], - [ - '7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5', - '8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6' - ], - [ - 'ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6', - '8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e' - ], - [ - '16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5', - '5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d' - ], - [ - 'eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99', - 'f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc' - ], - [ - '78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51', - 'f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4' - ], - [ - '494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5', - '42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c' - ], - [ - 'a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5', - '204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b' - ], - [ - 'c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997', - '4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913' - ], - [ - '841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881', - '73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154' - ], - [ - '5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5', - '39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865' - ], - [ - '36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66', - 'd2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc' - ], - [ - '336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726', - 'ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224' - ], - [ - '8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede', - '6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e' - ], - [ - '1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94', - '60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6' - ], - [ - '85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31', - '3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511' - ], - [ - '29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51', - 'b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b' - ], - [ - 'a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252', - 'ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2' - ], - [ - '4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5', - 'cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c' - ], - [ - 'd24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b', - '6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3' - ], - [ - 'ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4', - '322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d' - ], - [ - 'af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f', - '6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700' - ], - [ - 'e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889', - '2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4' - ], - [ - '591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246', - 'b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196' - ], - [ - '11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984', - '998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4' - ], - [ - '3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a', - 'b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257' - ], - [ - 'cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030', - 'bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13' - ], - [ - 'c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197', - '6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096' - ], - [ - 'c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593', - 'c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38' - ], - [ - 'a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef', - '21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f' - ], - [ - '347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38', - '60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448' - ], - [ - 'da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a', - '49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a' - ], - [ - 'c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111', - '5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4' - ], - [ - '4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502', - '7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437' - ], - [ - '3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea', - 'be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7' - ], - [ - 'cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26', - '8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d' - ], - [ - 'b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986', - '39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a' - ], - [ - 'd4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e', - '62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54' - ], - [ - '48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4', - '25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77' - ], - [ - 'dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda', - 'ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517' - ], - [ - '6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859', - 'cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10' - ], - [ - 'e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f', - 'f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125' - ], - [ - 'eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c', - '6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e' - ], - [ - '13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942', - 'fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1' - ], - [ - 'ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a', - '1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2' - ], - [ - 'b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80', - '5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423' - ], - [ - 'ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d', - '438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8' - ], - [ - '8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1', - 'cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758' - ], - [ - '52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63', - 'c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375' - ], - [ - 'e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352', - '6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d' - ], - [ - '7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193', - 'ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec' - ], - [ - '5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00', - '9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0' - ], - [ - '32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58', - 'ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c' - ], - [ - 'e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7', - 'd3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4' - ], - [ - '8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8', - 'c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f' - ], - [ - '4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e', - '67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649' - ], - [ - '3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d', - 'cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826' - ], - [ - '674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b', - '299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5' - ], - [ - 'd32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f', - 'f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87' - ], - [ - '30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6', - '462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b' - ], - [ - 'be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297', - '62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc' - ], - [ - '93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a', - '7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c' - ], - [ - 'b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c', - 'ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f' - ], - [ - 'd5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52', - '4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a' - ], - [ - 'd3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb', - 'bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46' - ], - [ - '463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065', - 'bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f' - ], - [ - '7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917', - '603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03' - ], - [ - '74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9', - 'cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08' - ], - [ - '30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3', - '553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8' - ], - [ - '9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57', - '712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373' - ], - [ - '176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66', - 'ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3' - ], - [ - '75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8', - '9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8' - ], - [ - '809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721', - '9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1' - ], - [ - '1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180', - '4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9' - ] - ] - } -}; - -},{}],"ExaX":[function(require,module,exports) { -'use strict'; - -var curves = exports; - -var hash = require('hash.js'); -var curve = require('./curve'); -var utils = require('./utils'); - -var assert = utils.assert; - -function PresetCurve(options) { - if (options.type === 'short') - this.curve = new curve.short(options); - else if (options.type === 'edwards') - this.curve = new curve.edwards(options); - else - this.curve = new curve.mont(options); - this.g = this.curve.g; - this.n = this.curve.n; - this.hash = options.hash; - - assert(this.g.validate(), 'Invalid curve'); - assert(this.g.mul(this.n).isInfinity(), 'Invalid curve, G*N != O'); -} -curves.PresetCurve = PresetCurve; - -function defineCurve(name, options) { - Object.defineProperty(curves, name, { - configurable: true, - enumerable: true, - get: function() { - var curve = new PresetCurve(options); - Object.defineProperty(curves, name, { - configurable: true, - enumerable: true, - value: curve - }); - return curve; - } - }); -} - -defineCurve('p192', { - type: 'short', - prime: 'p192', - p: 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff', - a: 'ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc', - b: '64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1', - n: 'ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831', - hash: hash.sha256, - gRed: false, - g: [ - '188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012', - '07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811' - ] -}); - -defineCurve('p224', { - type: 'short', - prime: 'p224', - p: 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001', - a: 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe', - b: 'b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4', - n: 'ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d', - hash: hash.sha256, - gRed: false, - g: [ - 'b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21', - 'bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34' - ] -}); - -defineCurve('p256', { - type: 'short', - prime: null, - p: 'ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff', - a: 'ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc', - b: '5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b', - n: 'ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551', - hash: hash.sha256, - gRed: false, - g: [ - '6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296', - '4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5' - ] -}); - -defineCurve('p384', { - type: 'short', - prime: null, - p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + - 'fffffffe ffffffff 00000000 00000000 ffffffff', - a: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + - 'fffffffe ffffffff 00000000 00000000 fffffffc', - b: 'b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f ' + - '5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef', - n: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 ' + - 'f4372ddf 581a0db2 48b0a77a ecec196a ccc52973', - hash: hash.sha384, - gRed: false, - g: [ - 'aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 ' + - '5502f25d bf55296c 3a545e38 72760ab7', - '3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 ' + - '0a60b1ce 1d7e819d 7a431d7c 90ea0e5f' - ] -}); - -defineCurve('p521', { - type: 'short', - prime: null, - p: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' + - 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + - 'ffffffff ffffffff ffffffff ffffffff ffffffff', - a: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' + - 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + - 'ffffffff ffffffff ffffffff ffffffff fffffffc', - b: '00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b ' + - '99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd ' + - '3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00', - n: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' + - 'ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 ' + - 'f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409', - hash: hash.sha512, - gRed: false, - g: [ - '000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 ' + - '053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 ' + - 'a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66', - '00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 ' + - '579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 ' + - '3fad0761 353c7086 a272c240 88be9476 9fd16650' - ] -}); - -defineCurve('curve25519', { - type: 'mont', - prime: 'p25519', - p: '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed', - a: '76d06', - b: '1', - n: '1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed', - hash: hash.sha256, - gRed: false, - g: [ - '9' - ] -}); - -defineCurve('ed25519', { - type: 'edwards', - prime: 'p25519', - p: '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed', - a: '-1', - c: '1', - // -121665 * (121666^(-1)) (mod P) - d: '52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3', - n: '1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed', - hash: hash.sha256, - gRed: false, - g: [ - '216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a', - - // 4/5 - '6666666666666666666666666666666666666666666666666666666666666658' - ] -}); - -var pre; -try { - pre = require('./precomputed/secp256k1'); -} catch (e) { - pre = undefined; -} - -defineCurve('secp256k1', { - type: 'short', - prime: 'k256', - p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f', - a: '0', - b: '7', - n: 'ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141', - h: '1', - hash: hash.sha256, - - // Precomputed endomorphism - beta: '7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee', - lambda: '5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72', - basis: [ - { - a: '3086d221a7d46bcde86c90e49284eb15', - b: '-e4437ed6010e88286f547fa90abfe4c3' - }, - { - a: '114ca50f7a8e2f3f657c1108d9d44cfd8', - b: '3086d221a7d46bcde86c90e49284eb15' - } - ], - - gRed: false, - g: [ - '79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798', - '483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8', - pre - ] -}); - -},{"hash.js":"fVGI","./curve":"P4Ml","./utils":"F8Ez","./precomputed/secp256k1":"khx4"}],"vdhc":[function(require,module,exports) { -'use strict'; - -var hash = require('hash.js'); -var utils = require('minimalistic-crypto-utils'); -var assert = require('minimalistic-assert'); - -function HmacDRBG(options) { - if (!(this instanceof HmacDRBG)) - return new HmacDRBG(options); - this.hash = options.hash; - this.predResist = !!options.predResist; - - this.outLen = this.hash.outSize; - this.minEntropy = options.minEntropy || this.hash.hmacStrength; - - this._reseed = null; - this.reseedInterval = null; - this.K = null; - this.V = null; - - var entropy = utils.toArray(options.entropy, options.entropyEnc || 'hex'); - var nonce = utils.toArray(options.nonce, options.nonceEnc || 'hex'); - var pers = utils.toArray(options.pers, options.persEnc || 'hex'); - assert(entropy.length >= (this.minEntropy / 8), - 'Not enough entropy. Minimum is: ' + this.minEntropy + ' bits'); - this._init(entropy, nonce, pers); -} -module.exports = HmacDRBG; - -HmacDRBG.prototype._init = function init(entropy, nonce, pers) { - var seed = entropy.concat(nonce).concat(pers); - - this.K = new Array(this.outLen / 8); - this.V = new Array(this.outLen / 8); - for (var i = 0; i < this.V.length; i++) { - this.K[i] = 0x00; - this.V[i] = 0x01; - } - - this._update(seed); - this._reseed = 1; - this.reseedInterval = 0x1000000000000; // 2^48 -}; - -HmacDRBG.prototype._hmac = function hmac() { - return new hash.hmac(this.hash, this.K); -}; - -HmacDRBG.prototype._update = function update(seed) { - var kmac = this._hmac() - .update(this.V) - .update([ 0x00 ]); - if (seed) - kmac = kmac.update(seed); - this.K = kmac.digest(); - this.V = this._hmac().update(this.V).digest(); - if (!seed) - return; - - this.K = this._hmac() - .update(this.V) - .update([ 0x01 ]) - .update(seed) - .digest(); - this.V = this._hmac().update(this.V).digest(); -}; - -HmacDRBG.prototype.reseed = function reseed(entropy, entropyEnc, add, addEnc) { - // Optional entropy enc - if (typeof entropyEnc !== 'string') { - addEnc = add; - add = entropyEnc; - entropyEnc = null; - } - - entropy = utils.toArray(entropy, entropyEnc); - add = utils.toArray(add, addEnc); - - assert(entropy.length >= (this.minEntropy / 8), - 'Not enough entropy. Minimum is: ' + this.minEntropy + ' bits'); - - this._update(entropy.concat(add || [])); - this._reseed = 1; -}; - -HmacDRBG.prototype.generate = function generate(len, enc, add, addEnc) { - if (this._reseed > this.reseedInterval) - throw new Error('Reseed is required'); - - // Optional encoding - if (typeof enc !== 'string') { - addEnc = add; - add = enc; - enc = null; - } - - // Optional additional data - if (add) { - add = utils.toArray(add, addEnc || 'hex'); - this._update(add); - } - - var temp = []; - while (temp.length < len) { - this.V = this._hmac().update(this.V).digest(); - temp = temp.concat(this.V); - } - - var res = temp.slice(0, len); - this._update(add); - this._reseed++; - return utils.encode(res, enc); -}; - -},{"hash.js":"fVGI","minimalistic-crypto-utils":"vl2S","minimalistic-assert":"MpuC"}],"YPk7":[function(require,module,exports) { -'use strict'; - -var BN = require('bn.js'); -var utils = require('../utils'); -var assert = utils.assert; - -function KeyPair(ec, options) { - this.ec = ec; - this.priv = null; - this.pub = null; - - // KeyPair(ec, { priv: ..., pub: ... }) - if (options.priv) - this._importPrivate(options.priv, options.privEnc); - if (options.pub) - this._importPublic(options.pub, options.pubEnc); -} -module.exports = KeyPair; - -KeyPair.fromPublic = function fromPublic(ec, pub, enc) { - if (pub instanceof KeyPair) - return pub; - - return new KeyPair(ec, { - pub: pub, - pubEnc: enc - }); -}; - -KeyPair.fromPrivate = function fromPrivate(ec, priv, enc) { - if (priv instanceof KeyPair) - return priv; - - return new KeyPair(ec, { - priv: priv, - privEnc: enc - }); -}; - -KeyPair.prototype.validate = function validate() { - var pub = this.getPublic(); - - if (pub.isInfinity()) - return { result: false, reason: 'Invalid public key' }; - if (!pub.validate()) - return { result: false, reason: 'Public key is not a point' }; - if (!pub.mul(this.ec.curve.n).isInfinity()) - return { result: false, reason: 'Public key * N != O' }; - - return { result: true, reason: null }; -}; - -KeyPair.prototype.getPublic = function getPublic(compact, enc) { - // compact is optional argument - if (typeof compact === 'string') { - enc = compact; - compact = null; - } - - if (!this.pub) - this.pub = this.ec.g.mul(this.priv); - - if (!enc) - return this.pub; - - return this.pub.encode(enc, compact); -}; - -KeyPair.prototype.getPrivate = function getPrivate(enc) { - if (enc === 'hex') - return this.priv.toString(16, 2); - else - return this.priv; -}; - -KeyPair.prototype._importPrivate = function _importPrivate(key, enc) { - this.priv = new BN(key, enc || 16); - - // Ensure that the priv won't be bigger than n, otherwise we may fail - // in fixed multiplication method - this.priv = this.priv.umod(this.ec.curve.n); -}; - -KeyPair.prototype._importPublic = function _importPublic(key, enc) { - if (key.x || key.y) { - // Montgomery points only have an `x` coordinate. - // Weierstrass/Edwards points on the other hand have both `x` and - // `y` coordinates. - if (this.ec.curve.type === 'mont') { - assert(key.x, 'Need x coordinate'); - } else if (this.ec.curve.type === 'short' || - this.ec.curve.type === 'edwards') { - assert(key.x && key.y, 'Need both x and y coordinate'); - } - this.pub = this.ec.curve.point(key.x, key.y); - return; - } - this.pub = this.ec.curve.decodePoint(key, enc); -}; - -// ECDH -KeyPair.prototype.derive = function derive(pub) { - return pub.mul(this.priv).getX(); -}; - -// ECDSA -KeyPair.prototype.sign = function sign(msg, enc, options) { - return this.ec.sign(msg, this, enc, options); -}; - -KeyPair.prototype.verify = function verify(msg, signature) { - return this.ec.verify(msg, signature, this); -}; - -KeyPair.prototype.inspect = function inspect() { - return ''; -}; - -},{"bn.js":"BOxy","../utils":"F8Ez"}],"g9QR":[function(require,module,exports) { -'use strict'; - -var BN = require('bn.js'); - -var utils = require('../utils'); -var assert = utils.assert; - -function Signature(options, enc) { - if (options instanceof Signature) - return options; - - if (this._importDER(options, enc)) - return; - - assert(options.r && options.s, 'Signature without r or s'); - this.r = new BN(options.r, 16); - this.s = new BN(options.s, 16); - if (options.recoveryParam === undefined) - this.recoveryParam = null; - else - this.recoveryParam = options.recoveryParam; -} -module.exports = Signature; - -function Position() { - this.place = 0; -} - -function getLength(buf, p) { - var initial = buf[p.place++]; - if (!(initial & 0x80)) { - return initial; - } - var octetLen = initial & 0xf; - var val = 0; - for (var i = 0, off = p.place; i < octetLen; i++, off++) { - val <<= 8; - val |= buf[off]; - } - p.place = off; - return val; -} - -function rmPadding(buf) { - var i = 0; - var len = buf.length - 1; - while (!buf[i] && !(buf[i + 1] & 0x80) && i < len) { - i++; - } - if (i === 0) { - return buf; - } - return buf.slice(i); -} - -Signature.prototype._importDER = function _importDER(data, enc) { - data = utils.toArray(data, enc); - var p = new Position(); - if (data[p.place++] !== 0x30) { - return false; - } - var len = getLength(data, p); - if ((len + p.place) !== data.length) { - return false; - } - if (data[p.place++] !== 0x02) { - return false; - } - var rlen = getLength(data, p); - var r = data.slice(p.place, rlen + p.place); - p.place += rlen; - if (data[p.place++] !== 0x02) { - return false; - } - var slen = getLength(data, p); - if (data.length !== slen + p.place) { - return false; - } - var s = data.slice(p.place, slen + p.place); - if (r[0] === 0 && (r[1] & 0x80)) { - r = r.slice(1); - } - if (s[0] === 0 && (s[1] & 0x80)) { - s = s.slice(1); - } - - this.r = new BN(r); - this.s = new BN(s); - this.recoveryParam = null; - - return true; -}; - -function constructLength(arr, len) { - if (len < 0x80) { - arr.push(len); - return; - } - var octets = 1 + (Math.log(len) / Math.LN2 >>> 3); - arr.push(octets | 0x80); - while (--octets) { - arr.push((len >>> (octets << 3)) & 0xff); - } - arr.push(len); -} - -Signature.prototype.toDER = function toDER(enc) { - var r = this.r.toArray(); - var s = this.s.toArray(); - - // Pad values - if (r[0] & 0x80) - r = [ 0 ].concat(r); - // Pad values - if (s[0] & 0x80) - s = [ 0 ].concat(s); - - r = rmPadding(r); - s = rmPadding(s); - - while (!s[0] && !(s[1] & 0x80)) { - s = s.slice(1); - } - var arr = [ 0x02 ]; - constructLength(arr, r.length); - arr = arr.concat(r); - arr.push(0x02); - constructLength(arr, s.length); - var backHalf = arr.concat(s); - var res = [ 0x30 ]; - constructLength(res, backHalf.length); - res = res.concat(backHalf); - return utils.encode(res, enc); -}; - -},{"bn.js":"BOxy","../utils":"F8Ez"}],"Ly8t":[function(require,module,exports) { -'use strict'; - -var BN = require('bn.js'); -var HmacDRBG = require('hmac-drbg'); -var utils = require('../utils'); -var curves = require('../curves'); -var rand = require('brorand'); -var assert = utils.assert; - -var KeyPair = require('./key'); -var Signature = require('./signature'); - -function EC(options) { - if (!(this instanceof EC)) - return new EC(options); - - // Shortcut `elliptic.ec(curve-name)` - if (typeof options === 'string') { - assert(curves.hasOwnProperty(options), 'Unknown curve ' + options); - - options = curves[options]; - } - - // Shortcut for `elliptic.ec(elliptic.curves.curveName)` - if (options instanceof curves.PresetCurve) - options = { curve: options }; - - this.curve = options.curve.curve; - this.n = this.curve.n; - this.nh = this.n.ushrn(1); - this.g = this.curve.g; - - // Point on curve - this.g = options.curve.g; - this.g.precompute(options.curve.n.bitLength() + 1); - - // Hash for function for DRBG - this.hash = options.hash || options.curve.hash; -} -module.exports = EC; - -EC.prototype.keyPair = function keyPair(options) { - return new KeyPair(this, options); -}; - -EC.prototype.keyFromPrivate = function keyFromPrivate(priv, enc) { - return KeyPair.fromPrivate(this, priv, enc); -}; - -EC.prototype.keyFromPublic = function keyFromPublic(pub, enc) { - return KeyPair.fromPublic(this, pub, enc); -}; - -EC.prototype.genKeyPair = function genKeyPair(options) { - if (!options) - options = {}; - - // Instantiate Hmac_DRBG - var drbg = new HmacDRBG({ - hash: this.hash, - pers: options.pers, - persEnc: options.persEnc || 'utf8', - entropy: options.entropy || rand(this.hash.hmacStrength), - entropyEnc: options.entropy && options.entropyEnc || 'utf8', - nonce: this.n.toArray() - }); - - var bytes = this.n.byteLength(); - var ns2 = this.n.sub(new BN(2)); - do { - var priv = new BN(drbg.generate(bytes)); - if (priv.cmp(ns2) > 0) - continue; - - priv.iaddn(1); - return this.keyFromPrivate(priv); - } while (true); -}; - -EC.prototype._truncateToN = function truncateToN(msg, truncOnly) { - var delta = msg.byteLength() * 8 - this.n.bitLength(); - if (delta > 0) - msg = msg.ushrn(delta); - if (!truncOnly && msg.cmp(this.n) >= 0) - return msg.sub(this.n); - else - return msg; -}; - -EC.prototype.sign = function sign(msg, key, enc, options) { - if (typeof enc === 'object') { - options = enc; - enc = null; - } - if (!options) - options = {}; - - key = this.keyFromPrivate(key, enc); - msg = this._truncateToN(new BN(msg, 16)); - - // Zero-extend key to provide enough entropy - var bytes = this.n.byteLength(); - var bkey = key.getPrivate().toArray('be', bytes); - - // Zero-extend nonce to have the same byte size as N - var nonce = msg.toArray('be', bytes); - - // Instantiate Hmac_DRBG - var drbg = new HmacDRBG({ - hash: this.hash, - entropy: bkey, - nonce: nonce, - pers: options.pers, - persEnc: options.persEnc || 'utf8' - }); - - // Number of bytes to generate - var ns1 = this.n.sub(new BN(1)); - - for (var iter = 0; true; iter++) { - var k = options.k ? - options.k(iter) : - new BN(drbg.generate(this.n.byteLength())); - k = this._truncateToN(k, true); - if (k.cmpn(1) <= 0 || k.cmp(ns1) >= 0) - continue; - - var kp = this.g.mul(k); - if (kp.isInfinity()) - continue; - - var kpX = kp.getX(); - var r = kpX.umod(this.n); - if (r.cmpn(0) === 0) - continue; - - var s = k.invm(this.n).mul(r.mul(key.getPrivate()).iadd(msg)); - s = s.umod(this.n); - if (s.cmpn(0) === 0) - continue; - - var recoveryParam = (kp.getY().isOdd() ? 1 : 0) | - (kpX.cmp(r) !== 0 ? 2 : 0); - - // Use complement of `s`, if it is > `n / 2` - if (options.canonical && s.cmp(this.nh) > 0) { - s = this.n.sub(s); - recoveryParam ^= 1; - } - - return new Signature({ r: r, s: s, recoveryParam: recoveryParam }); - } -}; - -EC.prototype.verify = function verify(msg, signature, key, enc) { - msg = this._truncateToN(new BN(msg, 16)); - key = this.keyFromPublic(key, enc); - signature = new Signature(signature, 'hex'); - - // Perform primitive values validation - var r = signature.r; - var s = signature.s; - if (r.cmpn(1) < 0 || r.cmp(this.n) >= 0) - return false; - if (s.cmpn(1) < 0 || s.cmp(this.n) >= 0) - return false; - - // Validate signature - var sinv = s.invm(this.n); - var u1 = sinv.mul(msg).umod(this.n); - var u2 = sinv.mul(r).umod(this.n); - - if (!this.curve._maxwellTrick) { - var p = this.g.mulAdd(u1, key.getPublic(), u2); - if (p.isInfinity()) - return false; - - return p.getX().umod(this.n).cmp(r) === 0; - } - - // NOTE: Greg Maxwell's trick, inspired by: - // https://git.io/vad3K - - var p = this.g.jmulAdd(u1, key.getPublic(), u2); - if (p.isInfinity()) - return false; - - // Compare `p.x` of Jacobian point with `r`, - // this will do `p.x == r * p.z^2` instead of multiplying `p.x` by the - // inverse of `p.z^2` - return p.eqXToP(r); -}; - -EC.prototype.recoverPubKey = function(msg, signature, j, enc) { - assert((3 & j) === j, 'The recovery param is more than two bits'); - signature = new Signature(signature, enc); - - var n = this.n; - var e = new BN(msg); - var r = signature.r; - var s = signature.s; - - // A set LSB signifies that the y-coordinate is odd - var isYOdd = j & 1; - var isSecondKey = j >> 1; - if (r.cmp(this.curve.p.umod(this.curve.n)) >= 0 && isSecondKey) - throw new Error('Unable to find sencond key candinate'); - - // 1.1. Let x = r + jn. - if (isSecondKey) - r = this.curve.pointFromX(r.add(this.curve.n), isYOdd); - else - r = this.curve.pointFromX(r, isYOdd); - - var rInv = signature.r.invm(n); - var s1 = n.sub(e).mul(rInv).umod(n); - var s2 = s.mul(rInv).umod(n); - - // 1.6.1 Compute Q = r^-1 (sR - eG) - // Q = r^-1 (sR + -eG) - return this.g.mulAdd(s1, r, s2); -}; - -EC.prototype.getKeyRecoveryParam = function(e, signature, Q, enc) { - signature = new Signature(signature, enc); - if (signature.recoveryParam !== null) - return signature.recoveryParam; - - for (var i = 0; i < 4; i++) { - var Qprime; - try { - Qprime = this.recoverPubKey(e, signature, i); - } catch (e) { - continue; - } - - if (Qprime.eq(Q)) - return i; - } - throw new Error('Unable to find valid recovery factor'); -}; - -},{"bn.js":"BOxy","hmac-drbg":"vdhc","../utils":"F8Ez","../curves":"ExaX","brorand":"e03B","./key":"YPk7","./signature":"g9QR"}],"mg26":[function(require,module,exports) { -'use strict'; - -var utils = require('../utils'); -var assert = utils.assert; -var parseBytes = utils.parseBytes; -var cachedProperty = utils.cachedProperty; - -/** -* @param {EDDSA} eddsa - instance -* @param {Object} params - public/private key parameters -* -* @param {Array} [params.secret] - secret seed bytes -* @param {Point} [params.pub] - public key point (aka `A` in eddsa terms) -* @param {Array} [params.pub] - public key point encoded as bytes -* -*/ -function KeyPair(eddsa, params) { - this.eddsa = eddsa; - this._secret = parseBytes(params.secret); - if (eddsa.isPoint(params.pub)) - this._pub = params.pub; - else - this._pubBytes = parseBytes(params.pub); -} - -KeyPair.fromPublic = function fromPublic(eddsa, pub) { - if (pub instanceof KeyPair) - return pub; - return new KeyPair(eddsa, { pub: pub }); -}; - -KeyPair.fromSecret = function fromSecret(eddsa, secret) { - if (secret instanceof KeyPair) - return secret; - return new KeyPair(eddsa, { secret: secret }); -}; - -KeyPair.prototype.secret = function secret() { - return this._secret; -}; - -cachedProperty(KeyPair, 'pubBytes', function pubBytes() { - return this.eddsa.encodePoint(this.pub()); -}); - -cachedProperty(KeyPair, 'pub', function pub() { - if (this._pubBytes) - return this.eddsa.decodePoint(this._pubBytes); - return this.eddsa.g.mul(this.priv()); -}); - -cachedProperty(KeyPair, 'privBytes', function privBytes() { - var eddsa = this.eddsa; - var hash = this.hash(); - var lastIx = eddsa.encodingLength - 1; - - var a = hash.slice(0, eddsa.encodingLength); - a[0] &= 248; - a[lastIx] &= 127; - a[lastIx] |= 64; - - return a; -}); - -cachedProperty(KeyPair, 'priv', function priv() { - return this.eddsa.decodeInt(this.privBytes()); -}); - -cachedProperty(KeyPair, 'hash', function hash() { - return this.eddsa.hash().update(this.secret()).digest(); -}); - -cachedProperty(KeyPair, 'messagePrefix', function messagePrefix() { - return this.hash().slice(this.eddsa.encodingLength); -}); - -KeyPair.prototype.sign = function sign(message) { - assert(this._secret, 'KeyPair can only verify'); - return this.eddsa.sign(message, this); -}; - -KeyPair.prototype.verify = function verify(message, sig) { - return this.eddsa.verify(message, sig, this); -}; - -KeyPair.prototype.getSecret = function getSecret(enc) { - assert(this._secret, 'KeyPair is public only'); - return utils.encode(this.secret(), enc); -}; - -KeyPair.prototype.getPublic = function getPublic(enc) { - return utils.encode(this.pubBytes(), enc); -}; - -module.exports = KeyPair; - -},{"../utils":"F8Ez"}],"p5it":[function(require,module,exports) { -'use strict'; - -var BN = require('bn.js'); -var utils = require('../utils'); -var assert = utils.assert; -var cachedProperty = utils.cachedProperty; -var parseBytes = utils.parseBytes; - -/** -* @param {EDDSA} eddsa - eddsa instance -* @param {Array|Object} sig - -* @param {Array|Point} [sig.R] - R point as Point or bytes -* @param {Array|bn} [sig.S] - S scalar as bn or bytes -* @param {Array} [sig.Rencoded] - R point encoded -* @param {Array} [sig.Sencoded] - S scalar encoded -*/ -function Signature(eddsa, sig) { - this.eddsa = eddsa; - - if (typeof sig !== 'object') - sig = parseBytes(sig); - - if (Array.isArray(sig)) { - sig = { - R: sig.slice(0, eddsa.encodingLength), - S: sig.slice(eddsa.encodingLength) - }; - } - - assert(sig.R && sig.S, 'Signature without R or S'); - - if (eddsa.isPoint(sig.R)) - this._R = sig.R; - if (sig.S instanceof BN) - this._S = sig.S; - - this._Rencoded = Array.isArray(sig.R) ? sig.R : sig.Rencoded; - this._Sencoded = Array.isArray(sig.S) ? sig.S : sig.Sencoded; -} - -cachedProperty(Signature, 'S', function S() { - return this.eddsa.decodeInt(this.Sencoded()); -}); - -cachedProperty(Signature, 'R', function R() { - return this.eddsa.decodePoint(this.Rencoded()); -}); - -cachedProperty(Signature, 'Rencoded', function Rencoded() { - return this.eddsa.encodePoint(this.R()); -}); - -cachedProperty(Signature, 'Sencoded', function Sencoded() { - return this.eddsa.encodeInt(this.S()); -}); - -Signature.prototype.toBytes = function toBytes() { - return this.Rencoded().concat(this.Sencoded()); -}; - -Signature.prototype.toHex = function toHex() { - return utils.encode(this.toBytes(), 'hex').toUpperCase(); -}; - -module.exports = Signature; - -},{"bn.js":"BOxy","../utils":"F8Ez"}],"a3LM":[function(require,module,exports) { -'use strict'; - -var hash = require('hash.js'); -var curves = require('../curves'); -var utils = require('../utils'); -var assert = utils.assert; -var parseBytes = utils.parseBytes; -var KeyPair = require('./key'); -var Signature = require('./signature'); - -function EDDSA(curve) { - assert(curve === 'ed25519', 'only tested with ed25519 so far'); - - if (!(this instanceof EDDSA)) - return new EDDSA(curve); - - var curve = curves[curve].curve; - this.curve = curve; - this.g = curve.g; - this.g.precompute(curve.n.bitLength() + 1); - - this.pointClass = curve.point().constructor; - this.encodingLength = Math.ceil(curve.n.bitLength() / 8); - this.hash = hash.sha512; -} - -module.exports = EDDSA; - -/** -* @param {Array|String} message - message bytes -* @param {Array|String|KeyPair} secret - secret bytes or a keypair -* @returns {Signature} - signature -*/ -EDDSA.prototype.sign = function sign(message, secret) { - message = parseBytes(message); - var key = this.keyFromSecret(secret); - var r = this.hashInt(key.messagePrefix(), message); - var R = this.g.mul(r); - var Rencoded = this.encodePoint(R); - var s_ = this.hashInt(Rencoded, key.pubBytes(), message) - .mul(key.priv()); - var S = r.add(s_).umod(this.curve.n); - return this.makeSignature({ R: R, S: S, Rencoded: Rencoded }); -}; - -/** -* @param {Array} message - message bytes -* @param {Array|String|Signature} sig - sig bytes -* @param {Array|String|Point|KeyPair} pub - public key -* @returns {Boolean} - true if public key matches sig of message -*/ -EDDSA.prototype.verify = function verify(message, sig, pub) { - message = parseBytes(message); - sig = this.makeSignature(sig); - var key = this.keyFromPublic(pub); - var h = this.hashInt(sig.Rencoded(), key.pubBytes(), message); - var SG = this.g.mul(sig.S()); - var RplusAh = sig.R().add(key.pub().mul(h)); - return RplusAh.eq(SG); -}; - -EDDSA.prototype.hashInt = function hashInt() { - var hash = this.hash(); - for (var i = 0; i < arguments.length; i++) - hash.update(arguments[i]); - return utils.intFromLE(hash.digest()).umod(this.curve.n); -}; - -EDDSA.prototype.keyFromPublic = function keyFromPublic(pub) { - return KeyPair.fromPublic(this, pub); -}; - -EDDSA.prototype.keyFromSecret = function keyFromSecret(secret) { - return KeyPair.fromSecret(this, secret); -}; - -EDDSA.prototype.makeSignature = function makeSignature(sig) { - if (sig instanceof Signature) - return sig; - return new Signature(this, sig); -}; - -/** -* * https://tools.ietf.org/html/draft-josefsson-eddsa-ed25519-03#section-5.2 -* -* EDDSA defines methods for encoding and decoding points and integers. These are -* helper convenience methods, that pass along to utility functions implied -* parameters. -* -*/ -EDDSA.prototype.encodePoint = function encodePoint(point) { - var enc = point.getY().toArray('le', this.encodingLength); - enc[this.encodingLength - 1] |= point.getX().isOdd() ? 0x80 : 0; - return enc; -}; - -EDDSA.prototype.decodePoint = function decodePoint(bytes) { - bytes = utils.parseBytes(bytes); - - var lastIx = bytes.length - 1; - var normed = bytes.slice(0, lastIx).concat(bytes[lastIx] & ~0x80); - var xIsOdd = (bytes[lastIx] & 0x80) !== 0; - - var y = utils.intFromLE(normed); - return this.curve.pointFromY(y, xIsOdd); -}; - -EDDSA.prototype.encodeInt = function encodeInt(num) { - return num.toArray('le', this.encodingLength); -}; - -EDDSA.prototype.decodeInt = function decodeInt(bytes) { - return utils.intFromLE(bytes); -}; - -EDDSA.prototype.isPoint = function isPoint(val) { - return val instanceof this.pointClass; -}; - -},{"hash.js":"fVGI","../curves":"ExaX","../utils":"F8Ez","./key":"mg26","./signature":"p5it"}],"xha3":[function(require,module,exports) { -'use strict'; - -var elliptic = exports; - -elliptic.version = require('../package.json').version; -elliptic.utils = require('./elliptic/utils'); -elliptic.rand = require('brorand'); -elliptic.curve = require('./elliptic/curve'); -elliptic.curves = require('./elliptic/curves'); - -// Protocols -elliptic.ec = require('./elliptic/ec'); -elliptic.eddsa = require('./elliptic/eddsa'); - -},{"../package.json":"bNi7","./elliptic/utils":"F8Ez","brorand":"e03B","./elliptic/curve":"P4Ml","./elliptic/curves":"ExaX","./elliptic/ec":"Ly8t","./elliptic/eddsa":"a3LM"}],"Wugr":[function(require,module,exports) { - -/* eslint-disable node/no-deprecated-api */ -var buffer = require('buffer') -var Buffer = buffer.Buffer - -// alternative to using Object.keys for old browsers -function copyProps (src, dst) { - for (var key in src) { - dst[key] = src[key] - } -} -if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { - module.exports = buffer -} else { - // Copy properties from require('buffer') - copyProps(buffer, exports) - exports.Buffer = SafeBuffer -} - -function SafeBuffer (arg, encodingOrOffset, length) { - return Buffer(arg, encodingOrOffset, length) -} - -SafeBuffer.prototype = Object.create(Buffer.prototype) - -// Copy static methods from Buffer -copyProps(Buffer, SafeBuffer) - -SafeBuffer.from = function (arg, encodingOrOffset, length) { - if (typeof arg === 'number') { - throw new TypeError('Argument must not be a number') - } - return Buffer(arg, encodingOrOffset, length) -} - -SafeBuffer.alloc = function (size, fill, encoding) { - if (typeof size !== 'number') { - throw new TypeError('Argument must be a number') - } - var buf = Buffer(size) - if (fill !== undefined) { - if (typeof encoding === 'string') { - buf.fill(fill, encoding) - } else { - buf.fill(fill) - } - } else { - buf.fill(0) - } - return buf -} - -SafeBuffer.allocUnsafe = function (size) { - if (typeof size !== 'number') { - throw new TypeError('Argument must be a number') - } - return Buffer(size) -} - -SafeBuffer.allocUnsafeSlow = function (size) { - if (typeof size !== 'number') { - throw new TypeError('Argument must be a number') - } - return buffer.SlowBuffer(size) -} - -},{"buffer":"dskh"}],"XJNj":[function(require,module,exports) { - -var global = arguments[3]; -var process = require("process"); -'use strict' - -// limit of Crypto.getRandomValues() -// https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues -var MAX_BYTES = 65536 - -// Node supports requesting up to this number of bytes -// https://github.com/nodejs/node/blob/master/lib/internal/crypto/random.js#L48 -var MAX_UINT32 = 4294967295 - -function oldBrowser () { - throw new Error('Secure random number generation is not supported by this browser.\nUse Chrome, Firefox or Internet Explorer 11') -} - -var Buffer = require('safe-buffer').Buffer -var crypto = global.crypto || global.msCrypto - -if (crypto && crypto.getRandomValues) { - module.exports = randomBytes -} else { - module.exports = oldBrowser -} - -function randomBytes (size, cb) { - // phantomjs needs to throw - if (size > MAX_UINT32) throw new RangeError('requested too many random bytes') - - var bytes = Buffer.allocUnsafe(size) - - if (size > 0) { // getRandomValues fails on IE if size == 0 - if (size > MAX_BYTES) { // this is the max bytes crypto.getRandomValues - // can do at once see https://developer.mozilla.org/en-US/docs/Web/API/window.crypto.getRandomValues - for (var generated = 0; generated < size; generated += MAX_BYTES) { - // buffer.slice automatically checks if the end is past the end of - // the buffer so we don't have to here - crypto.getRandomValues(bytes.slice(generated, generated + MAX_BYTES)) - } - } else { - crypto.getRandomValues(bytes) - } - } - - if (typeof cb === 'function') { - return process.nextTick(function () { - cb(null, bytes) - }) - } - - return bytes -} - -},{"safe-buffer":"Wugr","process":"pBGv"}],"FRpO":[function(require,module,exports) { -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. -'use strict'; - -var R = typeof Reflect === 'object' ? Reflect : null; -var ReflectApply = R && typeof R.apply === 'function' ? R.apply : function ReflectApply(target, receiver, args) { - return Function.prototype.apply.call(target, receiver, args); -}; -var ReflectOwnKeys; - -if (R && typeof R.ownKeys === 'function') { - ReflectOwnKeys = R.ownKeys; -} else if (Object.getOwnPropertySymbols) { - ReflectOwnKeys = function ReflectOwnKeys(target) { - return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target)); - }; -} else { - ReflectOwnKeys = function ReflectOwnKeys(target) { - return Object.getOwnPropertyNames(target); - }; -} - -function ProcessEmitWarning(warning) { - if (console && console.warn) console.warn(warning); -} - -var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) { - return value !== value; -}; - -function EventEmitter() { - EventEmitter.init.call(this); -} - -module.exports = EventEmitter; // Backwards-compat with node 0.10.x - -EventEmitter.EventEmitter = EventEmitter; -EventEmitter.prototype._events = undefined; -EventEmitter.prototype._eventsCount = 0; -EventEmitter.prototype._maxListeners = undefined; // By default EventEmitters will print a warning if more than 10 listeners are -// added to it. This is a useful default which helps finding memory leaks. - -var defaultMaxListeners = 10; -Object.defineProperty(EventEmitter, 'defaultMaxListeners', { - enumerable: true, - get: function () { - return defaultMaxListeners; - }, - set: function (arg) { - if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) { - throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.'); - } - - defaultMaxListeners = arg; - } -}); - -EventEmitter.init = function () { - if (this._events === undefined || this._events === Object.getPrototypeOf(this)._events) { - this._events = Object.create(null); - this._eventsCount = 0; - } - - this._maxListeners = this._maxListeners || undefined; -}; // Obviously not all Emitters should be limited to 10. This function allows -// that to be increased. Set to zero for unlimited. - - -EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { - if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) { - throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.'); - } - - this._maxListeners = n; - return this; -}; - -function $getMaxListeners(that) { - if (that._maxListeners === undefined) return EventEmitter.defaultMaxListeners; - return that._maxListeners; -} - -EventEmitter.prototype.getMaxListeners = function getMaxListeners() { - return $getMaxListeners(this); -}; - -EventEmitter.prototype.emit = function emit(type) { - var args = []; - - for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); - - var doError = type === 'error'; - var events = this._events; - if (events !== undefined) doError = doError && events.error === undefined;else if (!doError) return false; // If there is no 'error' event listener then throw. - - if (doError) { - var er; - if (args.length > 0) er = args[0]; - - if (er instanceof Error) { - // Note: The comments on the `throw` lines are intentional, they show - // up in Node's output if this results in an unhandled exception. - throw er; // Unhandled 'error' event - } // At least give some kind of context to the user - - - var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : '')); - err.context = er; - throw err; // Unhandled 'error' event - } - - var handler = events[type]; - if (handler === undefined) return false; - - if (typeof handler === 'function') { - ReflectApply(handler, this, args); - } else { - var len = handler.length; - var listeners = arrayClone(handler, len); - - for (var i = 0; i < len; ++i) ReflectApply(listeners[i], this, args); - } - - return true; -}; - -function _addListener(target, type, listener, prepend) { - var m; - var events; - var existing; - - if (typeof listener !== 'function') { - throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); - } - - events = target._events; - - if (events === undefined) { - events = target._events = Object.create(null); - target._eventsCount = 0; - } else { - // To avoid recursion in the case that type === "newListener"! Before - // adding it to the listeners, first emit "newListener". - if (events.newListener !== undefined) { - target.emit('newListener', type, listener.listener ? listener.listener : listener); // Re-assign `events` because a newListener handler could have caused the - // this._events to be assigned to a new object - - events = target._events; - } - - existing = events[type]; - } - - if (existing === undefined) { - // Optimize the case of one listener. Don't need the extra array object. - existing = events[type] = listener; - ++target._eventsCount; - } else { - if (typeof existing === 'function') { - // Adding the second element, need to change to array. - existing = events[type] = prepend ? [listener, existing] : [existing, listener]; // If we've already got an array, just append. - } else if (prepend) { - existing.unshift(listener); - } else { - existing.push(listener); - } // Check for listener leak - - - m = $getMaxListeners(target); - - if (m > 0 && existing.length > m && !existing.warned) { - existing.warned = true; // No error code for this since it is a Warning - // eslint-disable-next-line no-restricted-syntax - - var w = new Error('Possible EventEmitter memory leak detected. ' + existing.length + ' ' + String(type) + ' listeners ' + 'added. Use emitter.setMaxListeners() to ' + 'increase limit'); - w.name = 'MaxListenersExceededWarning'; - w.emitter = target; - w.type = type; - w.count = existing.length; - ProcessEmitWarning(w); - } - } - - return target; -} - -EventEmitter.prototype.addListener = function addListener(type, listener) { - return _addListener(this, type, listener, false); -}; - -EventEmitter.prototype.on = EventEmitter.prototype.addListener; - -EventEmitter.prototype.prependListener = function prependListener(type, listener) { - return _addListener(this, type, listener, true); -}; - -function onceWrapper() { - var args = []; - - for (var i = 0; i < arguments.length; i++) args.push(arguments[i]); - - if (!this.fired) { - this.target.removeListener(this.type, this.wrapFn); - this.fired = true; - ReflectApply(this.listener, this.target, args); - } -} - -function _onceWrap(target, type, listener) { - var state = { - fired: false, - wrapFn: undefined, - target: target, - type: type, - listener: listener - }; - var wrapped = onceWrapper.bind(state); - wrapped.listener = listener; - state.wrapFn = wrapped; - return wrapped; -} - -EventEmitter.prototype.once = function once(type, listener) { - if (typeof listener !== 'function') { - throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); - } - - this.on(type, _onceWrap(this, type, listener)); - return this; -}; - -EventEmitter.prototype.prependOnceListener = function prependOnceListener(type, listener) { - if (typeof listener !== 'function') { - throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); - } - - this.prependListener(type, _onceWrap(this, type, listener)); - return this; -}; // Emits a 'removeListener' event if and only if the listener was removed. - - -EventEmitter.prototype.removeListener = function removeListener(type, listener) { - var list, events, position, i, originalListener; - - if (typeof listener !== 'function') { - throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); - } - - events = this._events; - if (events === undefined) return this; - list = events[type]; - if (list === undefined) return this; - - if (list === listener || list.listener === listener) { - if (--this._eventsCount === 0) this._events = Object.create(null);else { - delete events[type]; - if (events.removeListener) this.emit('removeListener', type, list.listener || listener); - } - } else if (typeof list !== 'function') { - position = -1; - - for (i = list.length - 1; i >= 0; i--) { - if (list[i] === listener || list[i].listener === listener) { - originalListener = list[i].listener; - position = i; - break; - } - } - - if (position < 0) return this; - if (position === 0) list.shift();else { - spliceOne(list, position); - } - if (list.length === 1) events[type] = list[0]; - if (events.removeListener !== undefined) this.emit('removeListener', type, originalListener || listener); - } - - return this; -}; - -EventEmitter.prototype.off = EventEmitter.prototype.removeListener; - -EventEmitter.prototype.removeAllListeners = function removeAllListeners(type) { - var listeners, events, i; - events = this._events; - if (events === undefined) return this; // not listening for removeListener, no need to emit - - if (events.removeListener === undefined) { - if (arguments.length === 0) { - this._events = Object.create(null); - this._eventsCount = 0; - } else if (events[type] !== undefined) { - if (--this._eventsCount === 0) this._events = Object.create(null);else delete events[type]; - } - - return this; - } // emit removeListener for all listeners on all events - - - if (arguments.length === 0) { - var keys = Object.keys(events); - var key; - - for (i = 0; i < keys.length; ++i) { - key = keys[i]; - if (key === 'removeListener') continue; - this.removeAllListeners(key); - } - - this.removeAllListeners('removeListener'); - this._events = Object.create(null); - this._eventsCount = 0; - return this; - } - - listeners = events[type]; - - if (typeof listeners === 'function') { - this.removeListener(type, listeners); - } else if (listeners !== undefined) { - // LIFO order - for (i = listeners.length - 1; i >= 0; i--) { - this.removeListener(type, listeners[i]); - } - } - - return this; -}; - -function _listeners(target, type, unwrap) { - var events = target._events; - if (events === undefined) return []; - var evlistener = events[type]; - if (evlistener === undefined) return []; - if (typeof evlistener === 'function') return unwrap ? [evlistener.listener || evlistener] : [evlistener]; - return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); -} - -EventEmitter.prototype.listeners = function listeners(type) { - return _listeners(this, type, true); -}; - -EventEmitter.prototype.rawListeners = function rawListeners(type) { - return _listeners(this, type, false); -}; - -EventEmitter.listenerCount = function (emitter, type) { - if (typeof emitter.listenerCount === 'function') { - return emitter.listenerCount(type); - } else { - return listenerCount.call(emitter, type); - } -}; - -EventEmitter.prototype.listenerCount = listenerCount; - -function listenerCount(type) { - var events = this._events; - - if (events !== undefined) { - var evlistener = events[type]; - - if (typeof evlistener === 'function') { - return 1; - } else if (evlistener !== undefined) { - return evlistener.length; - } - } - - return 0; -} - -EventEmitter.prototype.eventNames = function eventNames() { - return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; -}; - -function arrayClone(arr, n) { - var copy = new Array(n); - - for (var i = 0; i < n; ++i) copy[i] = arr[i]; - - return copy; -} - -function spliceOne(list, index) { - for (; index + 1 < list.length; index++) list[index] = list[index + 1]; - - list.pop(); -} - -function unwrapListeners(arr) { - var ret = new Array(arr.length); - - for (var i = 0; i < ret.length; ++i) { - ret[i] = arr[i].listener || arr[i]; - } - - return ret; -} -},{}],"Yj0v":[function(require,module,exports) { -var process = require("process"); -'use strict'; - -if (typeof process === 'undefined' || - !process.version || - process.version.indexOf('v0.') === 0 || - process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { - module.exports = { nextTick: nextTick }; -} else { - module.exports = process -} - -function nextTick(fn, arg1, arg2, arg3) { - if (typeof fn !== 'function') { - throw new TypeError('"callback" argument must be a function'); - } - var len = arguments.length; - var args, i; - switch (len) { - case 0: - case 1: - return process.nextTick(fn); - case 2: - return process.nextTick(function afterTickOne() { - fn.call(null, arg1); - }); - case 3: - return process.nextTick(function afterTickTwo() { - fn.call(null, arg1, arg2); - }); - case 4: - return process.nextTick(function afterTickThree() { - fn.call(null, arg1, arg2, arg3); - }); - default: - args = new Array(len - 1); - i = 0; - while (i < args.length) { - args[i++] = arguments[i]; - } - return process.nextTick(function afterTick() { - fn.apply(null, args); - }); - } -} - - -},{"process":"pBGv"}],"Q8A6":[function(require,module,exports) { -module.exports = require('events').EventEmitter; - -},{"events":"FRpO"}],"l6K0":[function(require,module,exports) { - -/* eslint-disable node/no-deprecated-api */ -var buffer = require('buffer') -var Buffer = buffer.Buffer - -// alternative to using Object.keys for old browsers -function copyProps (src, dst) { - for (var key in src) { - dst[key] = src[key] - } -} -if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { - module.exports = buffer -} else { - // Copy properties from require('buffer') - copyProps(buffer, exports) - exports.Buffer = SafeBuffer -} - -function SafeBuffer (arg, encodingOrOffset, length) { - return Buffer(arg, encodingOrOffset, length) -} - -// Copy static methods from Buffer -copyProps(Buffer, SafeBuffer) - -SafeBuffer.from = function (arg, encodingOrOffset, length) { - if (typeof arg === 'number') { - throw new TypeError('Argument must not be a number') - } - return Buffer(arg, encodingOrOffset, length) -} - -SafeBuffer.alloc = function (size, fill, encoding) { - if (typeof size !== 'number') { - throw new TypeError('Argument must be a number') - } - var buf = Buffer(size) - if (fill !== undefined) { - if (typeof encoding === 'string') { - buf.fill(fill, encoding) - } else { - buf.fill(fill) - } - } else { - buf.fill(0) - } - return buf -} - -SafeBuffer.allocUnsafe = function (size) { - if (typeof size !== 'number') { - throw new TypeError('Argument must be a number') - } - return Buffer(size) -} - -SafeBuffer.allocUnsafeSlow = function (size) { - if (typeof size !== 'number') { - throw new TypeError('Argument must be a number') - } - return buffer.SlowBuffer(size) -} - -},{"buffer":"dskh"}],"Q14w":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// NOTE: These type checking functions intentionally don't use `instanceof` -// because it is fragile and can be easily faked with `Object.create()`. - -function isArray(arg) { - if (Array.isArray) { - return Array.isArray(arg); - } - return objectToString(arg) === '[object Array]'; -} -exports.isArray = isArray; - -function isBoolean(arg) { - return typeof arg === 'boolean'; -} -exports.isBoolean = isBoolean; - -function isNull(arg) { - return arg === null; -} -exports.isNull = isNull; - -function isNullOrUndefined(arg) { - return arg == null; -} -exports.isNullOrUndefined = isNullOrUndefined; - -function isNumber(arg) { - return typeof arg === 'number'; -} -exports.isNumber = isNumber; - -function isString(arg) { - return typeof arg === 'string'; -} -exports.isString = isString; - -function isSymbol(arg) { - return typeof arg === 'symbol'; -} -exports.isSymbol = isSymbol; - -function isUndefined(arg) { - return arg === void 0; -} -exports.isUndefined = isUndefined; - -function isRegExp(re) { - return objectToString(re) === '[object RegExp]'; -} -exports.isRegExp = isRegExp; - -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} -exports.isObject = isObject; - -function isDate(d) { - return objectToString(d) === '[object Date]'; -} -exports.isDate = isDate; - -function isError(e) { - return (objectToString(e) === '[object Error]' || e instanceof Error); -} -exports.isError = isError; - -function isFunction(arg) { - return typeof arg === 'function'; -} -exports.isFunction = isFunction; - -function isPrimitive(arg) { - return arg === null || - typeof arg === 'boolean' || - typeof arg === 'number' || - typeof arg === 'string' || - typeof arg === 'symbol' || // ES6 symbol - typeof arg === 'undefined'; -} -exports.isPrimitive = isPrimitive; - -exports.isBuffer = Buffer.isBuffer; - -function objectToString(o) { - return Object.prototype.toString.call(o); -} - -},{"buffer":"dskh"}],"Um5I":[function(require,module,exports) { - -'use strict'; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var Buffer = require('safe-buffer').Buffer; -var util = require('util'); - -function copyBuffer(src, target, offset) { - src.copy(target, offset); -} - -module.exports = function () { - function BufferList() { - _classCallCheck(this, BufferList); - - this.head = null; - this.tail = null; - this.length = 0; - } - - BufferList.prototype.push = function push(v) { - var entry = { data: v, next: null }; - if (this.length > 0) this.tail.next = entry;else this.head = entry; - this.tail = entry; - ++this.length; - }; - - BufferList.prototype.unshift = function unshift(v) { - var entry = { data: v, next: this.head }; - if (this.length === 0) this.tail = entry; - this.head = entry; - ++this.length; - }; - - BufferList.prototype.shift = function shift() { - if (this.length === 0) return; - var ret = this.head.data; - if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; - --this.length; - return ret; - }; - - BufferList.prototype.clear = function clear() { - this.head = this.tail = null; - this.length = 0; - }; - - BufferList.prototype.join = function join(s) { - if (this.length === 0) return ''; - var p = this.head; - var ret = '' + p.data; - while (p = p.next) { - ret += s + p.data; - }return ret; - }; - - BufferList.prototype.concat = function concat(n) { - if (this.length === 0) return Buffer.alloc(0); - if (this.length === 1) return this.head.data; - var ret = Buffer.allocUnsafe(n >>> 0); - var p = this.head; - var i = 0; - while (p) { - copyBuffer(p.data, ret, i); - i += p.data.length; - p = p.next; - } - return ret; - }; - - return BufferList; -}(); - -if (util && util.inspect && util.inspect.custom) { - module.exports.prototype[util.inspect.custom] = function () { - var obj = util.inspect({ length: this.length }); - return this.constructor.name + ' ' + obj; - }; -} -},{"safe-buffer":"l6K0","util":"rDCW"}],"avqi":[function(require,module,exports) { -'use strict'; - -/**/ - -var pna = require('process-nextick-args'); -/**/ - -// undocumented cb() API, needed for core, not for public API -function destroy(err, cb) { - var _this = this; - - var readableDestroyed = this._readableState && this._readableState.destroyed; - var writableDestroyed = this._writableState && this._writableState.destroyed; - - if (readableDestroyed || writableDestroyed) { - if (cb) { - cb(err); - } else if (err && (!this._writableState || !this._writableState.errorEmitted)) { - pna.nextTick(emitErrorNT, this, err); - } - return this; - } - - // we set destroyed to true before firing error callbacks in order - // to make it re-entrance safe in case destroy() is called within callbacks - - if (this._readableState) { - this._readableState.destroyed = true; - } - - // if this is a duplex stream mark the writable part as destroyed as well - if (this._writableState) { - this._writableState.destroyed = true; - } - - this._destroy(err || null, function (err) { - if (!cb && err) { - pna.nextTick(emitErrorNT, _this, err); - if (_this._writableState) { - _this._writableState.errorEmitted = true; - } - } else if (cb) { - cb(err); - } - }); - - return this; -} - -function undestroy() { - if (this._readableState) { - this._readableState.destroyed = false; - this._readableState.reading = false; - this._readableState.ended = false; - this._readableState.endEmitted = false; - } - - if (this._writableState) { - this._writableState.destroyed = false; - this._writableState.ended = false; - this._writableState.ending = false; - this._writableState.finished = false; - this._writableState.errorEmitted = false; - } -} - -function emitErrorNT(self, err) { - self.emit('error', err); -} - -module.exports = { - destroy: destroy, - undestroy: undestroy -}; -},{"process-nextick-args":"Yj0v"}],"yM1o":[function(require,module,exports) { -var global = arguments[3]; - -/** - * Module exports. - */ - -module.exports = deprecate; - -/** - * Mark that a method should not be used. - * Returns a modified function which warns once by default. - * - * If `localStorage.noDeprecation = true` is set, then it is a no-op. - * - * If `localStorage.throwDeprecation = true` is set, then deprecated functions - * will throw an Error when invoked. - * - * If `localStorage.traceDeprecation = true` is set, then deprecated functions - * will invoke `console.trace()` instead of `console.error()`. - * - * @param {Function} fn - the function to deprecate - * @param {String} msg - the string to print to the console when `fn` is invoked - * @returns {Function} a new "deprecated" version of `fn` - * @api public - */ - -function deprecate (fn, msg) { - if (config('noDeprecation')) { - return fn; - } - - var warned = false; - function deprecated() { - if (!warned) { - if (config('throwDeprecation')) { - throw new Error(msg); - } else if (config('traceDeprecation')) { - console.trace(msg); - } else { - console.warn(msg); - } - warned = true; - } - return fn.apply(this, arguments); - } - - return deprecated; -} - -/** - * Checks `localStorage` for boolean values for the given `name`. - * - * @param {String} name - * @returns {Boolean} - * @api private - */ - -function config (name) { - // accessing global.localStorage can trigger a DOMException in sandboxed iframes - try { - if (!global.localStorage) return false; - } catch (_) { - return false; - } - var val = global.localStorage[name]; - if (null == val) return false; - return String(val).toLowerCase() === 'true'; -} - -},{}],"I0x5":[function(require,module,exports) { -var process = require("process"); - -var global = arguments[3]; -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. -// A bit simpler than readable streams. -// Implement an async ._write(chunk, encoding, cb), and it'll handle all -// the drain event emission and buffering. -'use strict'; -/**/ - -var pna = require('process-nextick-args'); -/**/ - - -module.exports = Writable; -/* */ - -function WriteReq(chunk, encoding, cb) { - this.chunk = chunk; - this.encoding = encoding; - this.callback = cb; - this.next = null; -} // It seems a linked list but it is not -// there will be only 2 of these for each stream - - -function CorkedRequest(state) { - var _this = this; - - this.next = null; - this.entry = null; - - this.finish = function () { - onCorkedFinish(_this, state); - }; -} -/* */ - -/**/ - - -var asyncWrite = !true && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick; -/**/ - -/**/ - -var Duplex; -/**/ - -Writable.WritableState = WritableState; -/**/ - -var util = require('core-util-is'); - -util.inherits = require('inherits'); -/**/ - -/**/ - -var internalUtil = { - deprecate: require('util-deprecate') -}; -/**/ - -/**/ - -var Stream = require('./internal/streams/stream'); -/**/ - -/**/ - - -var Buffer = require('safe-buffer').Buffer; - -var OurUint8Array = global.Uint8Array || function () {}; - -function _uint8ArrayToBuffer(chunk) { - return Buffer.from(chunk); -} - -function _isUint8Array(obj) { - return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; -} -/**/ - - -var destroyImpl = require('./internal/streams/destroy'); - -util.inherits(Writable, Stream); - -function nop() {} - -function WritableState(options, stream) { - Duplex = Duplex || require('./_stream_duplex'); - options = options || {}; // Duplex streams are both readable and writable, but share - // the same options object. - // However, some cases require setting options to different - // values for the readable and the writable sides of the duplex stream. - // These options can be provided separately as readableXXX and writableXXX. - - var isDuplex = stream instanceof Duplex; // object stream flag to indicate whether or not this stream - // contains buffers or objects. - - this.objectMode = !!options.objectMode; - if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // the point at which write() starts returning false - // Note: 0 is a valid value, means that we always return false if - // the entire buffer is not flushed immediately on write() - - var hwm = options.highWaterMark; - var writableHwm = options.writableHighWaterMark; - var defaultHwm = this.objectMode ? 16 : 16 * 1024; - if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm; // cast to ints. - - this.highWaterMark = Math.floor(this.highWaterMark); // if _final has been called - - this.finalCalled = false; // drain event flag. - - this.needDrain = false; // at the start of calling end() - - this.ending = false; // when end() has been called, and returned - - this.ended = false; // when 'finish' is emitted - - this.finished = false; // has it been destroyed - - this.destroyed = false; // should we decode strings into buffers before passing to _write? - // this is here so that some node-core streams can optimize string - // handling at a lower level. - - var noDecode = options.decodeStrings === false; - this.decodeStrings = !noDecode; // Crypto is kind of old and crusty. Historically, its default string - // encoding is 'binary' so we have to make this configurable. - // Everything else in the universe uses 'utf8', though. - - this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement - // of how much we're waiting to get pushed to some underlying - // socket or file. - - this.length = 0; // a flag to see when we're in the middle of a write. - - this.writing = false; // when true all writes will be buffered until .uncork() call - - this.corked = 0; // a flag to be able to tell if the onwrite cb is called immediately, - // or on a later tick. We set this to true at first, because any - // actions that shouldn't happen until "later" should generally also - // not happen before the first write call. - - this.sync = true; // a flag to know if we're processing previously buffered items, which - // may call the _write() callback in the same tick, so that we don't - // end up in an overlapped onwrite situation. - - this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb) - - this.onwrite = function (er) { - onwrite(stream, er); - }; // the callback that the user supplies to write(chunk,encoding,cb) - - - this.writecb = null; // the amount that is being written when _write is called. - - this.writelen = 0; - this.bufferedRequest = null; - this.lastBufferedRequest = null; // number of pending user-supplied write callbacks - // this must be 0 before 'finish' can be emitted - - this.pendingcb = 0; // emit prefinish if the only thing we're waiting for is _write cbs - // This is relevant for synchronous Transform streams - - this.prefinished = false; // True if the error was already emitted and should not be thrown again - - this.errorEmitted = false; // count buffered requests - - this.bufferedRequestCount = 0; // allocate the first CorkedRequest, there is always - // one allocated and free to use, and we maintain at most two - - this.corkedRequestsFree = new CorkedRequest(this); -} - -WritableState.prototype.getBuffer = function getBuffer() { - var current = this.bufferedRequest; - var out = []; - - while (current) { - out.push(current); - current = current.next; - } - - return out; -}; - -(function () { - try { - Object.defineProperty(WritableState.prototype, 'buffer', { - get: internalUtil.deprecate(function () { - return this.getBuffer(); - }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') - }); - } catch (_) {} -})(); // Test _writableState for inheritance to account for Duplex streams, -// whose prototype chain only points to Readable. - - -var realHasInstance; - -if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { - realHasInstance = Function.prototype[Symbol.hasInstance]; - Object.defineProperty(Writable, Symbol.hasInstance, { - value: function (object) { - if (realHasInstance.call(this, object)) return true; - if (this !== Writable) return false; - return object && object._writableState instanceof WritableState; - } - }); -} else { - realHasInstance = function (object) { - return object instanceof this; - }; -} - -function Writable(options) { - Duplex = Duplex || require('./_stream_duplex'); // Writable ctor is applied to Duplexes, too. - // `realHasInstance` is necessary because using plain `instanceof` - // would return false, as no `_writableState` property is attached. - // Trying to use the custom `instanceof` for Writable here will also break the - // Node.js LazyTransform implementation, which has a non-trivial getter for - // `_writableState` that would lead to infinite recursion. - - if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) { - return new Writable(options); - } - - this._writableState = new WritableState(options, this); // legacy. - - this.writable = true; - - if (options) { - if (typeof options.write === 'function') this._write = options.write; - if (typeof options.writev === 'function') this._writev = options.writev; - if (typeof options.destroy === 'function') this._destroy = options.destroy; - if (typeof options.final === 'function') this._final = options.final; - } - - Stream.call(this); -} // Otherwise people can pipe Writable streams, which is just wrong. - - -Writable.prototype.pipe = function () { - this.emit('error', new Error('Cannot pipe, not readable')); -}; - -function writeAfterEnd(stream, cb) { - var er = new Error('write after end'); // TODO: defer error events consistently everywhere, not just the cb - - stream.emit('error', er); - pna.nextTick(cb, er); -} // Checks that a user-supplied chunk is valid, especially for the particular -// mode the stream is in. Currently this means that `null` is never accepted -// and undefined/non-string values are only allowed in object mode. - - -function validChunk(stream, state, chunk, cb) { - var valid = true; - var er = false; - - if (chunk === null) { - er = new TypeError('May not write null values to stream'); - } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { - er = new TypeError('Invalid non-string/buffer chunk'); - } - - if (er) { - stream.emit('error', er); - pna.nextTick(cb, er); - valid = false; - } - - return valid; -} - -Writable.prototype.write = function (chunk, encoding, cb) { - var state = this._writableState; - var ret = false; - - var isBuf = !state.objectMode && _isUint8Array(chunk); - - if (isBuf && !Buffer.isBuffer(chunk)) { - chunk = _uint8ArrayToBuffer(chunk); - } - - if (typeof encoding === 'function') { - cb = encoding; - encoding = null; - } - - if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; - if (typeof cb !== 'function') cb = nop; - if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { - state.pendingcb++; - ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); - } - return ret; -}; - -Writable.prototype.cork = function () { - var state = this._writableState; - state.corked++; -}; - -Writable.prototype.uncork = function () { - var state = this._writableState; - - if (state.corked) { - state.corked--; - if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); - } -}; - -Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { - // node::ParseEncoding() requires lower case. - if (typeof encoding === 'string') encoding = encoding.toLowerCase(); - if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); - this._writableState.defaultEncoding = encoding; - return this; -}; - -function decodeChunk(state, chunk, encoding) { - if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { - chunk = Buffer.from(chunk, encoding); - } - - return chunk; -} - -Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { - // making it explicit this property is not enumerable - // because otherwise some prototype manipulation in - // userland will fail - enumerable: false, - get: function () { - return this._writableState.highWaterMark; - } -}); // if we're already writing something, then just put this -// in the queue, and wait our turn. Otherwise, call _write -// If we return false, then we need a drain event, so set that flag. - -function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { - if (!isBuf) { - var newChunk = decodeChunk(state, chunk, encoding); - - if (chunk !== newChunk) { - isBuf = true; - encoding = 'buffer'; - chunk = newChunk; - } - } - - var len = state.objectMode ? 1 : chunk.length; - state.length += len; - var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false. - - if (!ret) state.needDrain = true; - - if (state.writing || state.corked) { - var last = state.lastBufferedRequest; - state.lastBufferedRequest = { - chunk: chunk, - encoding: encoding, - isBuf: isBuf, - callback: cb, - next: null - }; - - if (last) { - last.next = state.lastBufferedRequest; - } else { - state.bufferedRequest = state.lastBufferedRequest; - } - - state.bufferedRequestCount += 1; - } else { - doWrite(stream, state, false, len, chunk, encoding, cb); - } - - return ret; -} - -function doWrite(stream, state, writev, len, chunk, encoding, cb) { - state.writelen = len; - state.writecb = cb; - state.writing = true; - state.sync = true; - if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); - state.sync = false; -} - -function onwriteError(stream, state, sync, er, cb) { - --state.pendingcb; - - if (sync) { - // defer the callback if we are being called synchronously - // to avoid piling up things on the stack - pna.nextTick(cb, er); // this can emit finish, and it will always happen - // after error - - pna.nextTick(finishMaybe, stream, state); - stream._writableState.errorEmitted = true; - stream.emit('error', er); - } else { - // the caller expect this to happen before if - // it is async - cb(er); - stream._writableState.errorEmitted = true; - stream.emit('error', er); // this can emit finish, but finish must - // always follow error - - finishMaybe(stream, state); - } -} - -function onwriteStateUpdate(state) { - state.writing = false; - state.writecb = null; - state.length -= state.writelen; - state.writelen = 0; -} - -function onwrite(stream, er) { - var state = stream._writableState; - var sync = state.sync; - var cb = state.writecb; - onwriteStateUpdate(state); - if (er) onwriteError(stream, state, sync, er, cb);else { - // Check if we're actually ready to finish, but don't emit yet - var finished = needFinish(state); - - if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { - clearBuffer(stream, state); - } - - if (sync) { - /**/ - asyncWrite(afterWrite, stream, state, finished, cb); - /**/ - } else { - afterWrite(stream, state, finished, cb); - } - } -} - -function afterWrite(stream, state, finished, cb) { - if (!finished) onwriteDrain(stream, state); - state.pendingcb--; - cb(); - finishMaybe(stream, state); -} // Must force callback to be called on nextTick, so that we don't -// emit 'drain' before the write() consumer gets the 'false' return -// value, and has a chance to attach a 'drain' listener. - - -function onwriteDrain(stream, state) { - if (state.length === 0 && state.needDrain) { - state.needDrain = false; - stream.emit('drain'); - } -} // if there's something in the buffer waiting, then process it - - -function clearBuffer(stream, state) { - state.bufferProcessing = true; - var entry = state.bufferedRequest; - - if (stream._writev && entry && entry.next) { - // Fast case, write everything using _writev() - var l = state.bufferedRequestCount; - var buffer = new Array(l); - var holder = state.corkedRequestsFree; - holder.entry = entry; - var count = 0; - var allBuffers = true; - - while (entry) { - buffer[count] = entry; - if (!entry.isBuf) allBuffers = false; - entry = entry.next; - count += 1; - } - - buffer.allBuffers = allBuffers; - doWrite(stream, state, true, state.length, buffer, '', holder.finish); // doWrite is almost always async, defer these to save a bit of time - // as the hot path ends with doWrite - - state.pendingcb++; - state.lastBufferedRequest = null; - - if (holder.next) { - state.corkedRequestsFree = holder.next; - holder.next = null; - } else { - state.corkedRequestsFree = new CorkedRequest(state); - } - - state.bufferedRequestCount = 0; - } else { - // Slow case, write chunks one-by-one - while (entry) { - var chunk = entry.chunk; - var encoding = entry.encoding; - var cb = entry.callback; - var len = state.objectMode ? 1 : chunk.length; - doWrite(stream, state, false, len, chunk, encoding, cb); - entry = entry.next; - state.bufferedRequestCount--; // if we didn't call the onwrite immediately, then - // it means that we need to wait until it does. - // also, that means that the chunk and cb are currently - // being processed, so move the buffer counter past them. - - if (state.writing) { - break; - } - } - - if (entry === null) state.lastBufferedRequest = null; - } - - state.bufferedRequest = entry; - state.bufferProcessing = false; -} - -Writable.prototype._write = function (chunk, encoding, cb) { - cb(new Error('_write() is not implemented')); -}; - -Writable.prototype._writev = null; - -Writable.prototype.end = function (chunk, encoding, cb) { - var state = this._writableState; - - if (typeof chunk === 'function') { - cb = chunk; - chunk = null; - encoding = null; - } else if (typeof encoding === 'function') { - cb = encoding; - encoding = null; - } - - if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); // .end() fully uncorks - - if (state.corked) { - state.corked = 1; - this.uncork(); - } // ignore unnecessary end() calls. - - - if (!state.ending && !state.finished) endWritable(this, state, cb); -}; - -function needFinish(state) { - return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; -} - -function callFinal(stream, state) { - stream._final(function (err) { - state.pendingcb--; - - if (err) { - stream.emit('error', err); - } - - state.prefinished = true; - stream.emit('prefinish'); - finishMaybe(stream, state); - }); -} - -function prefinish(stream, state) { - if (!state.prefinished && !state.finalCalled) { - if (typeof stream._final === 'function') { - state.pendingcb++; - state.finalCalled = true; - pna.nextTick(callFinal, stream, state); - } else { - state.prefinished = true; - stream.emit('prefinish'); - } - } -} - -function finishMaybe(stream, state) { - var need = needFinish(state); - - if (need) { - prefinish(stream, state); - - if (state.pendingcb === 0) { - state.finished = true; - stream.emit('finish'); - } - } - - return need; -} - -function endWritable(stream, state, cb) { - state.ending = true; - finishMaybe(stream, state); - - if (cb) { - if (state.finished) pna.nextTick(cb);else stream.once('finish', cb); - } - - state.ended = true; - stream.writable = false; -} - -function onCorkedFinish(corkReq, state, err) { - var entry = corkReq.entry; - corkReq.entry = null; - - while (entry) { - var cb = entry.callback; - state.pendingcb--; - cb(err); - entry = entry.next; - } - - if (state.corkedRequestsFree) { - state.corkedRequestsFree.next = corkReq; - } else { - state.corkedRequestsFree = corkReq; - } -} - -Object.defineProperty(Writable.prototype, 'destroyed', { - get: function () { - if (this._writableState === undefined) { - return false; - } - - return this._writableState.destroyed; - }, - set: function (value) { - // we ignore the value if the stream - // has not been initialized yet - if (!this._writableState) { - return; - } // backward compatibility, the user is explicitly - // managing destroyed - - - this._writableState.destroyed = value; - } -}); -Writable.prototype.destroy = destroyImpl.destroy; -Writable.prototype._undestroy = destroyImpl.undestroy; - -Writable.prototype._destroy = function (err, cb) { - this.end(); - cb(err); -}; -},{"process-nextick-args":"Yj0v","core-util-is":"Q14w","inherits":"Bm0n","util-deprecate":"yM1o","./internal/streams/stream":"Q8A6","safe-buffer":"l6K0","./internal/streams/destroy":"avqi","./_stream_duplex":"wldW","process":"pBGv"}],"wldW":[function(require,module,exports) { -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// a duplex stream is just a stream that is both readable and writable. -// Since JS doesn't have multiple prototypal inheritance, this class -// prototypally inherits from Readable, and then parasitically from -// Writable. - -'use strict'; - -/**/ - -var pna = require('process-nextick-args'); -/**/ - -/**/ -var objectKeys = Object.keys || function (obj) { - var keys = []; - for (var key in obj) { - keys.push(key); - }return keys; -}; -/**/ - -module.exports = Duplex; - -/**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ - -var Readable = require('./_stream_readable'); -var Writable = require('./_stream_writable'); - -util.inherits(Duplex, Readable); - -{ - // avoid scope creep, the keys array can then be collected - var keys = objectKeys(Writable.prototype); - for (var v = 0; v < keys.length; v++) { - var method = keys[v]; - if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; - } -} - -function Duplex(options) { - if (!(this instanceof Duplex)) return new Duplex(options); - - Readable.call(this, options); - Writable.call(this, options); - - if (options && options.readable === false) this.readable = false; - - if (options && options.writable === false) this.writable = false; - - this.allowHalfOpen = true; - if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; - - this.once('end', onend); -} - -Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { - // making it explicit this property is not enumerable - // because otherwise some prototype manipulation in - // userland will fail - enumerable: false, - get: function () { - return this._writableState.highWaterMark; - } -}); - -// the no-half-open enforcer -function onend() { - // if we allow half-open state, or if the writable side ended, - // then we're ok. - if (this.allowHalfOpen || this._writableState.ended) return; - - // no more data can be written. - // But allow more writes to happen in this tick. - pna.nextTick(onEndNT, this); -} - -function onEndNT(self) { - self.end(); -} - -Object.defineProperty(Duplex.prototype, 'destroyed', { - get: function () { - if (this._readableState === undefined || this._writableState === undefined) { - return false; - } - return this._readableState.destroyed && this._writableState.destroyed; - }, - set: function (value) { - // we ignore the value if the stream - // has not been initialized yet - if (this._readableState === undefined || this._writableState === undefined) { - return; - } - - // backward compatibility, the user is explicitly - // managing destroyed - this._readableState.destroyed = value; - this._writableState.destroyed = value; - } -}); - -Duplex.prototype._destroy = function (err, cb) { - this.push(null); - this.end(); - - pna.nextTick(cb, err); -}; -},{"process-nextick-args":"Yj0v","core-util-is":"Q14w","inherits":"Bm0n","./_stream_readable":"Ogwm","./_stream_writable":"I0x5"}],"F7WD":[function(require,module,exports) { - -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -'use strict'; - -/**/ - -var Buffer = require('safe-buffer').Buffer; -/**/ - -var isEncoding = Buffer.isEncoding || function (encoding) { - encoding = '' + encoding; - switch (encoding && encoding.toLowerCase()) { - case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': - return true; - default: - return false; - } -}; - -function _normalizeEncoding(enc) { - if (!enc) return 'utf8'; - var retried; - while (true) { - switch (enc) { - case 'utf8': - case 'utf-8': - return 'utf8'; - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return 'utf16le'; - case 'latin1': - case 'binary': - return 'latin1'; - case 'base64': - case 'ascii': - case 'hex': - return enc; - default: - if (retried) return; // undefined - enc = ('' + enc).toLowerCase(); - retried = true; - } - } -}; - -// Do not cache `Buffer.isEncoding` when checking encoding names as some -// modules monkey-patch it to support additional encodings -function normalizeEncoding(enc) { - var nenc = _normalizeEncoding(enc); - if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); - return nenc || enc; -} - -// StringDecoder provides an interface for efficiently splitting a series of -// buffers into a series of JS strings without breaking apart multi-byte -// characters. -exports.StringDecoder = StringDecoder; -function StringDecoder(encoding) { - this.encoding = normalizeEncoding(encoding); - var nb; - switch (this.encoding) { - case 'utf16le': - this.text = utf16Text; - this.end = utf16End; - nb = 4; - break; - case 'utf8': - this.fillLast = utf8FillLast; - nb = 4; - break; - case 'base64': - this.text = base64Text; - this.end = base64End; - nb = 3; - break; - default: - this.write = simpleWrite; - this.end = simpleEnd; - return; - } - this.lastNeed = 0; - this.lastTotal = 0; - this.lastChar = Buffer.allocUnsafe(nb); -} - -StringDecoder.prototype.write = function (buf) { - if (buf.length === 0) return ''; - var r; - var i; - if (this.lastNeed) { - r = this.fillLast(buf); - if (r === undefined) return ''; - i = this.lastNeed; - this.lastNeed = 0; - } else { - i = 0; - } - if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); - return r || ''; -}; - -StringDecoder.prototype.end = utf8End; - -// Returns only complete characters in a Buffer -StringDecoder.prototype.text = utf8Text; - -// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer -StringDecoder.prototype.fillLast = function (buf) { - if (this.lastNeed <= buf.length) { - buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); - return this.lastChar.toString(this.encoding, 0, this.lastTotal); - } - buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); - this.lastNeed -= buf.length; -}; - -// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a -// continuation byte. If an invalid byte is detected, -2 is returned. -function utf8CheckByte(byte) { - if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; - return byte >> 6 === 0x02 ? -1 : -2; -} - -// Checks at most 3 bytes at the end of a Buffer in order to detect an -// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) -// needed to complete the UTF-8 character (if applicable) are returned. -function utf8CheckIncomplete(self, buf, i) { - var j = buf.length - 1; - if (j < i) return 0; - var nb = utf8CheckByte(buf[j]); - if (nb >= 0) { - if (nb > 0) self.lastNeed = nb - 1; - return nb; - } - if (--j < i || nb === -2) return 0; - nb = utf8CheckByte(buf[j]); - if (nb >= 0) { - if (nb > 0) self.lastNeed = nb - 2; - return nb; - } - if (--j < i || nb === -2) return 0; - nb = utf8CheckByte(buf[j]); - if (nb >= 0) { - if (nb > 0) { - if (nb === 2) nb = 0;else self.lastNeed = nb - 3; - } - return nb; - } - return 0; -} - -// Validates as many continuation bytes for a multi-byte UTF-8 character as -// needed or are available. If we see a non-continuation byte where we expect -// one, we "replace" the validated continuation bytes we've seen so far with -// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding -// behavior. The continuation byte check is included three times in the case -// where all of the continuation bytes for a character exist in the same buffer. -// It is also done this way as a slight performance increase instead of using a -// loop. -function utf8CheckExtraBytes(self, buf, p) { - if ((buf[0] & 0xC0) !== 0x80) { - self.lastNeed = 0; - return '\ufffd'; - } - if (self.lastNeed > 1 && buf.length > 1) { - if ((buf[1] & 0xC0) !== 0x80) { - self.lastNeed = 1; - return '\ufffd'; - } - if (self.lastNeed > 2 && buf.length > 2) { - if ((buf[2] & 0xC0) !== 0x80) { - self.lastNeed = 2; - return '\ufffd'; - } - } - } -} - -// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. -function utf8FillLast(buf) { - var p = this.lastTotal - this.lastNeed; - var r = utf8CheckExtraBytes(this, buf, p); - if (r !== undefined) return r; - if (this.lastNeed <= buf.length) { - buf.copy(this.lastChar, p, 0, this.lastNeed); - return this.lastChar.toString(this.encoding, 0, this.lastTotal); - } - buf.copy(this.lastChar, p, 0, buf.length); - this.lastNeed -= buf.length; -} - -// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a -// partial character, the character's bytes are buffered until the required -// number of bytes are available. -function utf8Text(buf, i) { - var total = utf8CheckIncomplete(this, buf, i); - if (!this.lastNeed) return buf.toString('utf8', i); - this.lastTotal = total; - var end = buf.length - (total - this.lastNeed); - buf.copy(this.lastChar, 0, end); - return buf.toString('utf8', i, end); -} - -// For UTF-8, a replacement character is added when ending on a partial -// character. -function utf8End(buf) { - var r = buf && buf.length ? this.write(buf) : ''; - if (this.lastNeed) return r + '\ufffd'; - return r; -} - -// UTF-16LE typically needs two bytes per character, but even if we have an even -// number of bytes available, we need to check if we end on a leading/high -// surrogate. In that case, we need to wait for the next two bytes in order to -// decode the last character properly. -function utf16Text(buf, i) { - if ((buf.length - i) % 2 === 0) { - var r = buf.toString('utf16le', i); - if (r) { - var c = r.charCodeAt(r.length - 1); - if (c >= 0xD800 && c <= 0xDBFF) { - this.lastNeed = 2; - this.lastTotal = 4; - this.lastChar[0] = buf[buf.length - 2]; - this.lastChar[1] = buf[buf.length - 1]; - return r.slice(0, -1); - } - } - return r; - } - this.lastNeed = 1; - this.lastTotal = 2; - this.lastChar[0] = buf[buf.length - 1]; - return buf.toString('utf16le', i, buf.length - 1); -} - -// For UTF-16LE we do not explicitly append special replacement characters if we -// end on a partial character, we simply let v8 handle that. -function utf16End(buf) { - var r = buf && buf.length ? this.write(buf) : ''; - if (this.lastNeed) { - var end = this.lastTotal - this.lastNeed; - return r + this.lastChar.toString('utf16le', 0, end); - } - return r; -} - -function base64Text(buf, i) { - var n = (buf.length - i) % 3; - if (n === 0) return buf.toString('base64', i); - this.lastNeed = 3 - n; - this.lastTotal = 3; - if (n === 1) { - this.lastChar[0] = buf[buf.length - 1]; - } else { - this.lastChar[0] = buf[buf.length - 2]; - this.lastChar[1] = buf[buf.length - 1]; - } - return buf.toString('base64', i, buf.length - n); -} - -function base64End(buf) { - var r = buf && buf.length ? this.write(buf) : ''; - if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); - return r; -} - -// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) -function simpleWrite(buf) { - return buf.toString(this.encoding); -} - -function simpleEnd(buf) { - return buf && buf.length ? this.write(buf) : ''; -} -},{"safe-buffer":"l6K0"}],"Ogwm":[function(require,module,exports) { - -var global = arguments[3]; -var process = require("process"); -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -'use strict'; - -/**/ - -var pna = require('process-nextick-args'); -/**/ - -module.exports = Readable; - -/**/ -var isArray = require('isarray'); -/**/ - -/**/ -var Duplex; -/**/ - -Readable.ReadableState = ReadableState; - -/**/ -var EE = require('events').EventEmitter; - -var EElistenerCount = function (emitter, type) { - return emitter.listeners(type).length; -}; -/**/ - -/**/ -var Stream = require('./internal/streams/stream'); -/**/ - -/**/ - -var Buffer = require('safe-buffer').Buffer; -var OurUint8Array = global.Uint8Array || function () {}; -function _uint8ArrayToBuffer(chunk) { - return Buffer.from(chunk); -} -function _isUint8Array(obj) { - return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; -} - -/**/ - -/**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ - -/**/ -var debugUtil = require('util'); -var debug = void 0; -if (debugUtil && debugUtil.debuglog) { - debug = debugUtil.debuglog('stream'); -} else { - debug = function () {}; -} -/**/ - -var BufferList = require('./internal/streams/BufferList'); -var destroyImpl = require('./internal/streams/destroy'); -var StringDecoder; - -util.inherits(Readable, Stream); - -var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; - -function prependListener(emitter, event, fn) { - // Sadly this is not cacheable as some libraries bundle their own - // event emitter implementation with them. - if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); - - // This is a hack to make sure that our error handler is attached before any - // userland ones. NEVER DO THIS. This is here only because this code needs - // to continue to work with older versions of Node.js that do not include - // the prependListener() method. The goal is to eventually remove this hack. - if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; -} - -function ReadableState(options, stream) { - Duplex = Duplex || require('./_stream_duplex'); - - options = options || {}; - - // Duplex streams are both readable and writable, but share - // the same options object. - // However, some cases require setting options to different - // values for the readable and the writable sides of the duplex stream. - // These options can be provided separately as readableXXX and writableXXX. - var isDuplex = stream instanceof Duplex; - - // object stream flag. Used to make read(n) ignore n and to - // make all the buffer merging and length checks go away - this.objectMode = !!options.objectMode; - - if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; - - // the point at which it stops calling _read() to fill the buffer - // Note: 0 is a valid value, means "don't call _read preemptively ever" - var hwm = options.highWaterMark; - var readableHwm = options.readableHighWaterMark; - var defaultHwm = this.objectMode ? 16 : 16 * 1024; - - if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm; - - // cast to ints. - this.highWaterMark = Math.floor(this.highWaterMark); - - // A linked list is used to store data chunks instead of an array because the - // linked list can remove elements from the beginning faster than - // array.shift() - this.buffer = new BufferList(); - this.length = 0; - this.pipes = null; - this.pipesCount = 0; - this.flowing = null; - this.ended = false; - this.endEmitted = false; - this.reading = false; - - // a flag to be able to tell if the event 'readable'/'data' is emitted - // immediately, or on a later tick. We set this to true at first, because - // any actions that shouldn't happen until "later" should generally also - // not happen before the first read call. - this.sync = true; - - // whenever we return null, then we set a flag to say - // that we're awaiting a 'readable' event emission. - this.needReadable = false; - this.emittedReadable = false; - this.readableListening = false; - this.resumeScheduled = false; - - // has it been destroyed - this.destroyed = false; - - // Crypto is kind of old and crusty. Historically, its default string - // encoding is 'binary' so we have to make this configurable. - // Everything else in the universe uses 'utf8', though. - this.defaultEncoding = options.defaultEncoding || 'utf8'; - - // the number of writers that are awaiting a drain event in .pipe()s - this.awaitDrain = 0; - - // if true, a maybeReadMore has been scheduled - this.readingMore = false; - - this.decoder = null; - this.encoding = null; - if (options.encoding) { - if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; - this.decoder = new StringDecoder(options.encoding); - this.encoding = options.encoding; - } -} - -function Readable(options) { - Duplex = Duplex || require('./_stream_duplex'); - - if (!(this instanceof Readable)) return new Readable(options); - - this._readableState = new ReadableState(options, this); - - // legacy - this.readable = true; - - if (options) { - if (typeof options.read === 'function') this._read = options.read; - - if (typeof options.destroy === 'function') this._destroy = options.destroy; - } - - Stream.call(this); -} - -Object.defineProperty(Readable.prototype, 'destroyed', { - get: function () { - if (this._readableState === undefined) { - return false; - } - return this._readableState.destroyed; - }, - set: function (value) { - // we ignore the value if the stream - // has not been initialized yet - if (!this._readableState) { - return; - } - - // backward compatibility, the user is explicitly - // managing destroyed - this._readableState.destroyed = value; - } -}); - -Readable.prototype.destroy = destroyImpl.destroy; -Readable.prototype._undestroy = destroyImpl.undestroy; -Readable.prototype._destroy = function (err, cb) { - this.push(null); - cb(err); -}; - -// Manually shove something into the read() buffer. -// This returns true if the highWaterMark has not been hit yet, -// similar to how Writable.write() returns true if you should -// write() some more. -Readable.prototype.push = function (chunk, encoding) { - var state = this._readableState; - var skipChunkCheck; - - if (!state.objectMode) { - if (typeof chunk === 'string') { - encoding = encoding || state.defaultEncoding; - if (encoding !== state.encoding) { - chunk = Buffer.from(chunk, encoding); - encoding = ''; - } - skipChunkCheck = true; - } - } else { - skipChunkCheck = true; - } - - return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); -}; - -// Unshift should *always* be something directly out of read() -Readable.prototype.unshift = function (chunk) { - return readableAddChunk(this, chunk, null, true, false); -}; - -function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { - var state = stream._readableState; - if (chunk === null) { - state.reading = false; - onEofChunk(stream, state); - } else { - var er; - if (!skipChunkCheck) er = chunkInvalid(state, chunk); - if (er) { - stream.emit('error', er); - } else if (state.objectMode || chunk && chunk.length > 0) { - if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { - chunk = _uint8ArrayToBuffer(chunk); - } - - if (addToFront) { - if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true); - } else if (state.ended) { - stream.emit('error', new Error('stream.push() after EOF')); - } else { - state.reading = false; - if (state.decoder && !encoding) { - chunk = state.decoder.write(chunk); - if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); - } else { - addChunk(stream, state, chunk, false); - } - } - } else if (!addToFront) { - state.reading = false; - } - } - - return needMoreData(state); -} - -function addChunk(stream, state, chunk, addToFront) { - if (state.flowing && state.length === 0 && !state.sync) { - stream.emit('data', chunk); - stream.read(0); - } else { - // update the buffer info. - state.length += state.objectMode ? 1 : chunk.length; - if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); - - if (state.needReadable) emitReadable(stream); - } - maybeReadMore(stream, state); -} - -function chunkInvalid(state, chunk) { - var er; - if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { - er = new TypeError('Invalid non-string/buffer chunk'); - } - return er; -} - -// if it's past the high water mark, we can push in some more. -// Also, if we have no data yet, we can stand some -// more bytes. This is to work around cases where hwm=0, -// such as the repl. Also, if the push() triggered a -// readable event, and the user called read(largeNumber) such that -// needReadable was set, then we ought to push more, so that another -// 'readable' event will be triggered. -function needMoreData(state) { - return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); -} - -Readable.prototype.isPaused = function () { - return this._readableState.flowing === false; -}; - -// backwards compatibility. -Readable.prototype.setEncoding = function (enc) { - if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; - this._readableState.decoder = new StringDecoder(enc); - this._readableState.encoding = enc; - return this; -}; - -// Don't raise the hwm > 8MB -var MAX_HWM = 0x800000; -function computeNewHighWaterMark(n) { - if (n >= MAX_HWM) { - n = MAX_HWM; - } else { - // Get the next highest power of 2 to prevent increasing hwm excessively in - // tiny amounts - n--; - n |= n >>> 1; - n |= n >>> 2; - n |= n >>> 4; - n |= n >>> 8; - n |= n >>> 16; - n++; - } - return n; -} - -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function howMuchToRead(n, state) { - if (n <= 0 || state.length === 0 && state.ended) return 0; - if (state.objectMode) return 1; - if (n !== n) { - // Only flow one buffer at a time - if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; - } - // If we're asking for more than the current hwm, then raise the hwm. - if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); - if (n <= state.length) return n; - // Don't have enough - if (!state.ended) { - state.needReadable = true; - return 0; - } - return state.length; -} - -// you can override either this method, or the async _read(n) below. -Readable.prototype.read = function (n) { - debug('read', n); - n = parseInt(n, 10); - var state = this._readableState; - var nOrig = n; - - if (n !== 0) state.emittedReadable = false; - - // if we're doing read(0) to trigger a readable event, but we - // already have a bunch of data in the buffer, then just trigger - // the 'readable' event and move on. - if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { - debug('read: emitReadable', state.length, state.ended); - if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); - return null; - } - - n = howMuchToRead(n, state); - - // if we've ended, and we're now clear, then finish it up. - if (n === 0 && state.ended) { - if (state.length === 0) endReadable(this); - return null; - } - - // All the actual chunk generation logic needs to be - // *below* the call to _read. The reason is that in certain - // synthetic stream cases, such as passthrough streams, _read - // may be a completely synchronous operation which may change - // the state of the read buffer, providing enough data when - // before there was *not* enough. - // - // So, the steps are: - // 1. Figure out what the state of things will be after we do - // a read from the buffer. - // - // 2. If that resulting state will trigger a _read, then call _read. - // Note that this may be asynchronous, or synchronous. Yes, it is - // deeply ugly to write APIs this way, but that still doesn't mean - // that the Readable class should behave improperly, as streams are - // designed to be sync/async agnostic. - // Take note if the _read call is sync or async (ie, if the read call - // has returned yet), so that we know whether or not it's safe to emit - // 'readable' etc. - // - // 3. Actually pull the requested chunks out of the buffer and return. - - // if we need a readable event, then we need to do some reading. - var doRead = state.needReadable; - debug('need readable', doRead); - - // if we currently have less than the highWaterMark, then also read some - if (state.length === 0 || state.length - n < state.highWaterMark) { - doRead = true; - debug('length less than watermark', doRead); - } - - // however, if we've ended, then there's no point, and if we're already - // reading, then it's unnecessary. - if (state.ended || state.reading) { - doRead = false; - debug('reading or ended', doRead); - } else if (doRead) { - debug('do read'); - state.reading = true; - state.sync = true; - // if the length is currently zero, then we *need* a readable event. - if (state.length === 0) state.needReadable = true; - // call internal read method - this._read(state.highWaterMark); - state.sync = false; - // If _read pushed data synchronously, then `reading` will be false, - // and we need to re-evaluate how much data we can return to the user. - if (!state.reading) n = howMuchToRead(nOrig, state); - } - - var ret; - if (n > 0) ret = fromList(n, state);else ret = null; - - if (ret === null) { - state.needReadable = true; - n = 0; - } else { - state.length -= n; - } - - if (state.length === 0) { - // If we have nothing in the buffer, then we want to know - // as soon as we *do* get something into the buffer. - if (!state.ended) state.needReadable = true; - - // If we tried to read() past the EOF, then emit end on the next tick. - if (nOrig !== n && state.ended) endReadable(this); - } - - if (ret !== null) this.emit('data', ret); - - return ret; -}; - -function onEofChunk(stream, state) { - if (state.ended) return; - if (state.decoder) { - var chunk = state.decoder.end(); - if (chunk && chunk.length) { - state.buffer.push(chunk); - state.length += state.objectMode ? 1 : chunk.length; - } - } - state.ended = true; - - // emit 'readable' now to make sure it gets picked up. - emitReadable(stream); -} - -// Don't emit readable right away in sync mode, because this can trigger -// another read() call => stack overflow. This way, it might trigger -// a nextTick recursion warning, but that's not so bad. -function emitReadable(stream) { - var state = stream._readableState; - state.needReadable = false; - if (!state.emittedReadable) { - debug('emitReadable', state.flowing); - state.emittedReadable = true; - if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream); - } -} - -function emitReadable_(stream) { - debug('emit readable'); - stream.emit('readable'); - flow(stream); -} - -// at this point, the user has presumably seen the 'readable' event, -// and called read() to consume some data. that may have triggered -// in turn another _read(n) call, in which case reading = true if -// it's in progress. -// However, if we're not ended, or reading, and the length < hwm, -// then go ahead and try to read some more preemptively. -function maybeReadMore(stream, state) { - if (!state.readingMore) { - state.readingMore = true; - pna.nextTick(maybeReadMore_, stream, state); - } -} - -function maybeReadMore_(stream, state) { - var len = state.length; - while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { - debug('maybeReadMore read 0'); - stream.read(0); - if (len === state.length) - // didn't get any data, stop spinning. - break;else len = state.length; - } - state.readingMore = false; -} - -// abstract method. to be overridden in specific implementation classes. -// call cb(er, data) where data is <= n in length. -// for virtual (non-string, non-buffer) streams, "length" is somewhat -// arbitrary, and perhaps not very meaningful. -Readable.prototype._read = function (n) { - this.emit('error', new Error('_read() is not implemented')); -}; - -Readable.prototype.pipe = function (dest, pipeOpts) { - var src = this; - var state = this._readableState; - - switch (state.pipesCount) { - case 0: - state.pipes = dest; - break; - case 1: - state.pipes = [state.pipes, dest]; - break; - default: - state.pipes.push(dest); - break; - } - state.pipesCount += 1; - debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); - - var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; - - var endFn = doEnd ? onend : unpipe; - if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn); - - dest.on('unpipe', onunpipe); - function onunpipe(readable, unpipeInfo) { - debug('onunpipe'); - if (readable === src) { - if (unpipeInfo && unpipeInfo.hasUnpiped === false) { - unpipeInfo.hasUnpiped = true; - cleanup(); - } - } - } - - function onend() { - debug('onend'); - dest.end(); - } - - // when the dest drains, it reduces the awaitDrain counter - // on the source. This would be more elegant with a .once() - // handler in flow(), but adding and removing repeatedly is - // too slow. - var ondrain = pipeOnDrain(src); - dest.on('drain', ondrain); - - var cleanedUp = false; - function cleanup() { - debug('cleanup'); - // cleanup event handlers once the pipe is broken - dest.removeListener('close', onclose); - dest.removeListener('finish', onfinish); - dest.removeListener('drain', ondrain); - dest.removeListener('error', onerror); - dest.removeListener('unpipe', onunpipe); - src.removeListener('end', onend); - src.removeListener('end', unpipe); - src.removeListener('data', ondata); - - cleanedUp = true; - - // if the reader is waiting for a drain event from this - // specific writer, then it would cause it to never start - // flowing again. - // So, if this is awaiting a drain, then we just call it now. - // If we don't know, then assume that we are waiting for one. - if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); - } - - // If the user pushes more data while we're writing to dest then we'll end up - // in ondata again. However, we only want to increase awaitDrain once because - // dest will only emit one 'drain' event for the multiple writes. - // => Introduce a guard on increasing awaitDrain. - var increasedAwaitDrain = false; - src.on('data', ondata); - function ondata(chunk) { - debug('ondata'); - increasedAwaitDrain = false; - var ret = dest.write(chunk); - if (false === ret && !increasedAwaitDrain) { - // If the user unpiped during `dest.write()`, it is possible - // to get stuck in a permanently paused state if that write - // also returned false. - // => Check whether `dest` is still a piping destination. - if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { - debug('false write response, pause', src._readableState.awaitDrain); - src._readableState.awaitDrain++; - increasedAwaitDrain = true; - } - src.pause(); - } - } - - // if the dest has an error, then stop piping into it. - // however, don't suppress the throwing behavior for this. - function onerror(er) { - debug('onerror', er); - unpipe(); - dest.removeListener('error', onerror); - if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); - } - - // Make sure our error handler is attached before userland ones. - prependListener(dest, 'error', onerror); - - // Both close and finish should trigger unpipe, but only once. - function onclose() { - dest.removeListener('finish', onfinish); - unpipe(); - } - dest.once('close', onclose); - function onfinish() { - debug('onfinish'); - dest.removeListener('close', onclose); - unpipe(); - } - dest.once('finish', onfinish); - - function unpipe() { - debug('unpipe'); - src.unpipe(dest); - } - - // tell the dest that it's being piped to - dest.emit('pipe', src); - - // start the flow if it hasn't been started already. - if (!state.flowing) { - debug('pipe resume'); - src.resume(); - } - - return dest; -}; - -function pipeOnDrain(src) { - return function () { - var state = src._readableState; - debug('pipeOnDrain', state.awaitDrain); - if (state.awaitDrain) state.awaitDrain--; - if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { - state.flowing = true; - flow(src); - } - }; -} - -Readable.prototype.unpipe = function (dest) { - var state = this._readableState; - var unpipeInfo = { hasUnpiped: false }; - - // if we're not piping anywhere, then do nothing. - if (state.pipesCount === 0) return this; - - // just one destination. most common case. - if (state.pipesCount === 1) { - // passed in one, but it's not the right one. - if (dest && dest !== state.pipes) return this; - - if (!dest) dest = state.pipes; - - // got a match. - state.pipes = null; - state.pipesCount = 0; - state.flowing = false; - if (dest) dest.emit('unpipe', this, unpipeInfo); - return this; - } - - // slow case. multiple pipe destinations. - - if (!dest) { - // remove all. - var dests = state.pipes; - var len = state.pipesCount; - state.pipes = null; - state.pipesCount = 0; - state.flowing = false; - - for (var i = 0; i < len; i++) { - dests[i].emit('unpipe', this, unpipeInfo); - }return this; - } - - // try to find the right one. - var index = indexOf(state.pipes, dest); - if (index === -1) return this; - - state.pipes.splice(index, 1); - state.pipesCount -= 1; - if (state.pipesCount === 1) state.pipes = state.pipes[0]; - - dest.emit('unpipe', this, unpipeInfo); - - return this; -}; - -// set up data events if they are asked for -// Ensure readable listeners eventually get something -Readable.prototype.on = function (ev, fn) { - var res = Stream.prototype.on.call(this, ev, fn); - - if (ev === 'data') { - // Start flowing on next tick if stream isn't explicitly paused - if (this._readableState.flowing !== false) this.resume(); - } else if (ev === 'readable') { - var state = this._readableState; - if (!state.endEmitted && !state.readableListening) { - state.readableListening = state.needReadable = true; - state.emittedReadable = false; - if (!state.reading) { - pna.nextTick(nReadingNextTick, this); - } else if (state.length) { - emitReadable(this); - } - } - } - - return res; -}; -Readable.prototype.addListener = Readable.prototype.on; - -function nReadingNextTick(self) { - debug('readable nexttick read 0'); - self.read(0); -} - -// pause() and resume() are remnants of the legacy readable stream API -// If the user uses them, then switch into old mode. -Readable.prototype.resume = function () { - var state = this._readableState; - if (!state.flowing) { - debug('resume'); - state.flowing = true; - resume(this, state); - } - return this; -}; - -function resume(stream, state) { - if (!state.resumeScheduled) { - state.resumeScheduled = true; - pna.nextTick(resume_, stream, state); - } -} - -function resume_(stream, state) { - if (!state.reading) { - debug('resume read 0'); - stream.read(0); - } - - state.resumeScheduled = false; - state.awaitDrain = 0; - stream.emit('resume'); - flow(stream); - if (state.flowing && !state.reading) stream.read(0); -} - -Readable.prototype.pause = function () { - debug('call pause flowing=%j', this._readableState.flowing); - if (false !== this._readableState.flowing) { - debug('pause'); - this._readableState.flowing = false; - this.emit('pause'); - } - return this; -}; - -function flow(stream) { - var state = stream._readableState; - debug('flow', state.flowing); - while (state.flowing && stream.read() !== null) {} -} - -// wrap an old-style stream as the async data source. -// This is *not* part of the readable stream interface. -// It is an ugly unfortunate mess of history. -Readable.prototype.wrap = function (stream) { - var _this = this; - - var state = this._readableState; - var paused = false; - - stream.on('end', function () { - debug('wrapped end'); - if (state.decoder && !state.ended) { - var chunk = state.decoder.end(); - if (chunk && chunk.length) _this.push(chunk); - } - - _this.push(null); - }); - - stream.on('data', function (chunk) { - debug('wrapped data'); - if (state.decoder) chunk = state.decoder.write(chunk); - - // don't skip over falsy values in objectMode - if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; - - var ret = _this.push(chunk); - if (!ret) { - paused = true; - stream.pause(); - } - }); - - // proxy all the other methods. - // important when wrapping filters and duplexes. - for (var i in stream) { - if (this[i] === undefined && typeof stream[i] === 'function') { - this[i] = function (method) { - return function () { - return stream[method].apply(stream, arguments); - }; - }(i); - } - } - - // proxy certain important events. - for (var n = 0; n < kProxyEvents.length; n++) { - stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); - } - - // when we try to consume some more bytes, simply unpause the - // underlying stream. - this._read = function (n) { - debug('wrapped _read', n); - if (paused) { - paused = false; - stream.resume(); - } - }; - - return this; -}; - -Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { - // making it explicit this property is not enumerable - // because otherwise some prototype manipulation in - // userland will fail - enumerable: false, - get: function () { - return this._readableState.highWaterMark; - } -}); - -// exposed for testing purposes only. -Readable._fromList = fromList; - -// Pluck off n bytes from an array of buffers. -// Length is the combined lengths of all the buffers in the list. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function fromList(n, state) { - // nothing buffered - if (state.length === 0) return null; - - var ret; - if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { - // read it all, truncate the list - if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); - state.buffer.clear(); - } else { - // read part of list - ret = fromListPartial(n, state.buffer, state.decoder); - } - - return ret; -} - -// Extracts only enough buffered data to satisfy the amount requested. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function fromListPartial(n, list, hasStrings) { - var ret; - if (n < list.head.data.length) { - // slice is the same for buffers and strings - ret = list.head.data.slice(0, n); - list.head.data = list.head.data.slice(n); - } else if (n === list.head.data.length) { - // first chunk is a perfect match - ret = list.shift(); - } else { - // result spans more than one buffer - ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); - } - return ret; -} - -// Copies a specified amount of characters from the list of buffered data -// chunks. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function copyFromBufferString(n, list) { - var p = list.head; - var c = 1; - var ret = p.data; - n -= ret.length; - while (p = p.next) { - var str = p.data; - var nb = n > str.length ? str.length : n; - if (nb === str.length) ret += str;else ret += str.slice(0, n); - n -= nb; - if (n === 0) { - if (nb === str.length) { - ++c; - if (p.next) list.head = p.next;else list.head = list.tail = null; - } else { - list.head = p; - p.data = str.slice(nb); - } - break; - } - ++c; - } - list.length -= c; - return ret; -} - -// Copies a specified amount of bytes from the list of buffered data chunks. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function copyFromBuffer(n, list) { - var ret = Buffer.allocUnsafe(n); - var p = list.head; - var c = 1; - p.data.copy(ret); - n -= p.data.length; - while (p = p.next) { - var buf = p.data; - var nb = n > buf.length ? buf.length : n; - buf.copy(ret, ret.length - n, 0, nb); - n -= nb; - if (n === 0) { - if (nb === buf.length) { - ++c; - if (p.next) list.head = p.next;else list.head = list.tail = null; - } else { - list.head = p; - p.data = buf.slice(nb); - } - break; - } - ++c; - } - list.length -= c; - return ret; -} - -function endReadable(stream) { - var state = stream._readableState; - - // If we get here before consuming all the bytes, then that is a - // bug in node. Should never happen. - if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); - - if (!state.endEmitted) { - state.ended = true; - pna.nextTick(endReadableNT, state, stream); - } -} - -function endReadableNT(state, stream) { - // Check that we didn't get one last unshift. - if (!state.endEmitted && state.length === 0) { - state.endEmitted = true; - stream.readable = false; - stream.emit('end'); - } -} - -function indexOf(xs, x) { - for (var i = 0, l = xs.length; i < l; i++) { - if (xs[i] === x) return i; - } - return -1; -} -},{"process-nextick-args":"Yj0v","isarray":"REa7","events":"FRpO","./internal/streams/stream":"Q8A6","safe-buffer":"l6K0","core-util-is":"Q14w","inherits":"Bm0n","util":"rDCW","./internal/streams/BufferList":"Um5I","./internal/streams/destroy":"avqi","./_stream_duplex":"wldW","string_decoder/":"F7WD","process":"pBGv"}],"I3bg":[function(require,module,exports) { -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// a transform stream is a readable/writable stream where you do -// something with the data. Sometimes it's called a "filter", -// but that's not a great name for it, since that implies a thing where -// some bits pass through, and others are simply ignored. (That would -// be a valid example of a transform, of course.) -// -// While the output is causally related to the input, it's not a -// necessarily symmetric or synchronous transformation. For example, -// a zlib stream might take multiple plain-text writes(), and then -// emit a single compressed chunk some time in the future. -// -// Here's how this works: -// -// The Transform stream has all the aspects of the readable and writable -// stream classes. When you write(chunk), that calls _write(chunk,cb) -// internally, and returns false if there's a lot of pending writes -// buffered up. When you call read(), that calls _read(n) until -// there's enough pending readable data buffered up. -// -// In a transform stream, the written data is placed in a buffer. When -// _read(n) is called, it transforms the queued up data, calling the -// buffered _write cb's as it consumes chunks. If consuming a single -// written chunk would result in multiple output chunks, then the first -// outputted bit calls the readcb, and subsequent chunks just go into -// the read buffer, and will cause it to emit 'readable' if necessary. -// -// This way, back-pressure is actually determined by the reading side, -// since _read has to be called to start processing a new chunk. However, -// a pathological inflate type of transform can cause excessive buffering -// here. For example, imagine a stream where every byte of input is -// interpreted as an integer from 0-255, and then results in that many -// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in -// 1kb of data being output. In this case, you could write a very small -// amount of input, and end up with a very large amount of output. In -// such a pathological inflating mechanism, there'd be no way to tell -// the system to stop doing the transform. A single 4MB write could -// cause the system to run out of memory. -// -// However, even in such a pathological case, only a single written chunk -// would be consumed, and then the rest would wait (un-transformed) until -// the results of the previous transformed chunk were consumed. - -'use strict'; - -module.exports = Transform; - -var Duplex = require('./_stream_duplex'); - -/**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ - -util.inherits(Transform, Duplex); - -function afterTransform(er, data) { - var ts = this._transformState; - ts.transforming = false; - - var cb = ts.writecb; - - if (!cb) { - return this.emit('error', new Error('write callback called multiple times')); - } - - ts.writechunk = null; - ts.writecb = null; - - if (data != null) // single equals check for both `null` and `undefined` - this.push(data); - - cb(er); - - var rs = this._readableState; - rs.reading = false; - if (rs.needReadable || rs.length < rs.highWaterMark) { - this._read(rs.highWaterMark); - } -} - -function Transform(options) { - if (!(this instanceof Transform)) return new Transform(options); - - Duplex.call(this, options); - - this._transformState = { - afterTransform: afterTransform.bind(this), - needTransform: false, - transforming: false, - writecb: null, - writechunk: null, - writeencoding: null - }; - - // start out asking for a readable event once data is transformed. - this._readableState.needReadable = true; - - // we have implemented the _read method, and done the other things - // that Readable wants before the first _read call, so unset the - // sync guard flag. - this._readableState.sync = false; - - if (options) { - if (typeof options.transform === 'function') this._transform = options.transform; - - if (typeof options.flush === 'function') this._flush = options.flush; - } - - // When the writable side finishes, then flush out anything remaining. - this.on('prefinish', prefinish); -} - -function prefinish() { - var _this = this; - - if (typeof this._flush === 'function') { - this._flush(function (er, data) { - done(_this, er, data); - }); - } else { - done(this, null, null); - } -} - -Transform.prototype.push = function (chunk, encoding) { - this._transformState.needTransform = false; - return Duplex.prototype.push.call(this, chunk, encoding); -}; - -// This is the part where you do stuff! -// override this function in implementation classes. -// 'chunk' is an input chunk. -// -// Call `push(newChunk)` to pass along transformed output -// to the readable side. You may call 'push' zero or more times. -// -// Call `cb(err)` when you are done with this chunk. If you pass -// an error, then that'll put the hurt on the whole operation. If you -// never call cb(), then you'll never get another chunk. -Transform.prototype._transform = function (chunk, encoding, cb) { - throw new Error('_transform() is not implemented'); -}; - -Transform.prototype._write = function (chunk, encoding, cb) { - var ts = this._transformState; - ts.writecb = cb; - ts.writechunk = chunk; - ts.writeencoding = encoding; - if (!ts.transforming) { - var rs = this._readableState; - if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); - } -}; - -// Doesn't matter what the args are here. -// _transform does all the work. -// That we got here means that the readable side wants more data. -Transform.prototype._read = function (n) { - var ts = this._transformState; - - if (ts.writechunk !== null && ts.writecb && !ts.transforming) { - ts.transforming = true; - this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); - } else { - // mark that we need a transform, so that any data that comes in - // will get processed, now that we've asked for it. - ts.needTransform = true; - } -}; - -Transform.prototype._destroy = function (err, cb) { - var _this2 = this; - - Duplex.prototype._destroy.call(this, err, function (err2) { - cb(err2); - _this2.emit('close'); - }); -}; - -function done(stream, er, data) { - if (er) return stream.emit('error', er); - - if (data != null) // single equals check for both `null` and `undefined` - stream.push(data); - - // if there's nothing in the write buffer, then that means - // that nothing more will ever be provided - if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0'); - - if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming'); - - return stream.push(null); -} -},{"./_stream_duplex":"wldW","core-util-is":"Q14w","inherits":"Bm0n"}],"kQBK":[function(require,module,exports) { -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// a passthrough stream. -// basically just the most minimal sort of Transform stream. -// Every written chunk gets output as-is. - -'use strict'; - -module.exports = PassThrough; - -var Transform = require('./_stream_transform'); - -/**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ - -util.inherits(PassThrough, Transform); - -function PassThrough(options) { - if (!(this instanceof PassThrough)) return new PassThrough(options); - - Transform.call(this, options); -} - -PassThrough.prototype._transform = function (chunk, encoding, cb) { - cb(null, chunk); -}; -},{"./_stream_transform":"I3bg","core-util-is":"Q14w","inherits":"Bm0n"}],"uwsL":[function(require,module,exports) { -exports = module.exports = require('./lib/_stream_readable.js'); -exports.Stream = exports; -exports.Readable = exports; -exports.Writable = require('./lib/_stream_writable.js'); -exports.Duplex = require('./lib/_stream_duplex.js'); -exports.Transform = require('./lib/_stream_transform.js'); -exports.PassThrough = require('./lib/_stream_passthrough.js'); - -},{"./lib/_stream_readable.js":"Ogwm","./lib/_stream_writable.js":"I0x5","./lib/_stream_duplex.js":"wldW","./lib/_stream_transform.js":"I3bg","./lib/_stream_passthrough.js":"kQBK"}],"GAH2":[function(require,module,exports) { -module.exports = require('./lib/_stream_writable.js'); - -},{"./lib/_stream_writable.js":"I0x5"}],"dMbb":[function(require,module,exports) { -module.exports = require('./lib/_stream_duplex.js'); - -},{"./lib/_stream_duplex.js":"wldW"}],"yG3q":[function(require,module,exports) { -module.exports = require('./readable').Transform - -},{"./readable":"uwsL"}],"jlpe":[function(require,module,exports) { -module.exports = require('./readable').PassThrough - -},{"./readable":"uwsL"}],"fnRj":[function(require,module,exports) { -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -module.exports = Stream; - -var EE = require('events').EventEmitter; -var inherits = require('inherits'); - -inherits(Stream, EE); -Stream.Readable = require('readable-stream/readable.js'); -Stream.Writable = require('readable-stream/writable.js'); -Stream.Duplex = require('readable-stream/duplex.js'); -Stream.Transform = require('readable-stream/transform.js'); -Stream.PassThrough = require('readable-stream/passthrough.js'); - -// Backwards-compat with node 0.4.x -Stream.Stream = Stream; - - - -// old-style streams. Note that the pipe method (the only relevant -// part of this class) is overridden in the Readable class. - -function Stream() { - EE.call(this); -} - -Stream.prototype.pipe = function(dest, options) { - var source = this; - - function ondata(chunk) { - if (dest.writable) { - if (false === dest.write(chunk) && source.pause) { - source.pause(); - } - } - } - - source.on('data', ondata); - - function ondrain() { - if (source.readable && source.resume) { - source.resume(); - } - } - - dest.on('drain', ondrain); - - // If the 'end' option is not supplied, dest.end() will be called when - // source gets the 'end' or 'close' events. Only dest.end() once. - if (!dest._isStdio && (!options || options.end !== false)) { - source.on('end', onend); - source.on('close', onclose); - } - - var didOnEnd = false; - function onend() { - if (didOnEnd) return; - didOnEnd = true; - - dest.end(); - } - - - function onclose() { - if (didOnEnd) return; - didOnEnd = true; - - if (typeof dest.destroy === 'function') dest.destroy(); - } - - // don't leave dangling pipes when there are errors. - function onerror(er) { - cleanup(); - if (EE.listenerCount(this, 'error') === 0) { - throw er; // Unhandled stream error in pipe. - } - } - - source.on('error', onerror); - dest.on('error', onerror); - - // remove all the event listeners that were added. - function cleanup() { - source.removeListener('data', ondata); - dest.removeListener('drain', ondrain); - - source.removeListener('end', onend); - source.removeListener('close', onclose); - - source.removeListener('error', onerror); - dest.removeListener('error', onerror); - - source.removeListener('end', cleanup); - source.removeListener('close', cleanup); - - dest.removeListener('close', cleanup); - } - - source.on('end', cleanup); - source.on('close', cleanup); - - dest.on('close', cleanup); - - dest.emit('pipe', source); - - // Allow for unix-like usage: A.pipe(B).pipe(C) - return dest; -}; - -},{"events":"FRpO","inherits":"Bm0n","readable-stream/readable.js":"uwsL","readable-stream/writable.js":"GAH2","readable-stream/duplex.js":"dMbb","readable-stream/transform.js":"yG3q","readable-stream/passthrough.js":"jlpe"}],"UcQW":[function(require,module,exports) { - -'use strict'; - -var Buffer = require('safe-buffer').Buffer; - -var Transform = require('stream').Transform; - -var inherits = require('inherits'); - -function throwIfNotStringOrBuffer(val, prefix) { - if (!Buffer.isBuffer(val) && typeof val !== 'string') { - throw new TypeError(prefix + ' must be a string or a buffer'); - } -} - -function HashBase(blockSize) { - Transform.call(this); - this._block = Buffer.allocUnsafe(blockSize); - this._blockSize = blockSize; - this._blockOffset = 0; - this._length = [0, 0, 0, 0]; - this._finalized = false; -} - -inherits(HashBase, Transform); - -HashBase.prototype._transform = function (chunk, encoding, callback) { - var error = null; - - try { - this.update(chunk, encoding); - } catch (err) { - error = err; - } - - callback(error); -}; - -HashBase.prototype._flush = function (callback) { - var error = null; - - try { - this.push(this.digest()); - } catch (err) { - error = err; - } - - callback(error); -}; - -HashBase.prototype.update = function (data, encoding) { - throwIfNotStringOrBuffer(data, 'Data'); - if (this._finalized) throw new Error('Digest already called'); - if (!Buffer.isBuffer(data)) data = Buffer.from(data, encoding); // consume data - - var block = this._block; - var offset = 0; - - while (this._blockOffset + data.length - offset >= this._blockSize) { - for (var i = this._blockOffset; i < this._blockSize;) block[i++] = data[offset++]; - - this._update(); - - this._blockOffset = 0; - } - - while (offset < data.length) block[this._blockOffset++] = data[offset++]; // update length - - - for (var j = 0, carry = data.length * 8; carry > 0; ++j) { - this._length[j] += carry; - carry = this._length[j] / 0x0100000000 | 0; - if (carry > 0) this._length[j] -= 0x0100000000 * carry; - } - - return this; -}; - -HashBase.prototype._update = function () { - throw new Error('_update is not implemented'); -}; - -HashBase.prototype.digest = function (encoding) { - if (this._finalized) throw new Error('Digest already called'); - this._finalized = true; - - var digest = this._digest(); - - if (encoding !== undefined) digest = digest.toString(encoding); // reset state - - this._block.fill(0); - - this._blockOffset = 0; - - for (var i = 0; i < 4; ++i) this._length[i] = 0; - - return digest; -}; - -HashBase.prototype._digest = function () { - throw new Error('_digest is not implemented'); -}; - -module.exports = HashBase; -},{"safe-buffer":"Wugr","stream":"fnRj","inherits":"Bm0n"}],"OP64":[function(require,module,exports) { - -'use strict' -var inherits = require('inherits') -var HashBase = require('hash-base') -var Buffer = require('safe-buffer').Buffer - -var ARRAY16 = new Array(16) - -function MD5 () { - HashBase.call(this, 64) - - // state - this._a = 0x67452301 - this._b = 0xefcdab89 - this._c = 0x98badcfe - this._d = 0x10325476 -} - -inherits(MD5, HashBase) - -MD5.prototype._update = function () { - var M = ARRAY16 - for (var i = 0; i < 16; ++i) M[i] = this._block.readInt32LE(i * 4) - - var a = this._a - var b = this._b - var c = this._c - var d = this._d - - a = fnF(a, b, c, d, M[0], 0xd76aa478, 7) - d = fnF(d, a, b, c, M[1], 0xe8c7b756, 12) - c = fnF(c, d, a, b, M[2], 0x242070db, 17) - b = fnF(b, c, d, a, M[3], 0xc1bdceee, 22) - a = fnF(a, b, c, d, M[4], 0xf57c0faf, 7) - d = fnF(d, a, b, c, M[5], 0x4787c62a, 12) - c = fnF(c, d, a, b, M[6], 0xa8304613, 17) - b = fnF(b, c, d, a, M[7], 0xfd469501, 22) - a = fnF(a, b, c, d, M[8], 0x698098d8, 7) - d = fnF(d, a, b, c, M[9], 0x8b44f7af, 12) - c = fnF(c, d, a, b, M[10], 0xffff5bb1, 17) - b = fnF(b, c, d, a, M[11], 0x895cd7be, 22) - a = fnF(a, b, c, d, M[12], 0x6b901122, 7) - d = fnF(d, a, b, c, M[13], 0xfd987193, 12) - c = fnF(c, d, a, b, M[14], 0xa679438e, 17) - b = fnF(b, c, d, a, M[15], 0x49b40821, 22) - - a = fnG(a, b, c, d, M[1], 0xf61e2562, 5) - d = fnG(d, a, b, c, M[6], 0xc040b340, 9) - c = fnG(c, d, a, b, M[11], 0x265e5a51, 14) - b = fnG(b, c, d, a, M[0], 0xe9b6c7aa, 20) - a = fnG(a, b, c, d, M[5], 0xd62f105d, 5) - d = fnG(d, a, b, c, M[10], 0x02441453, 9) - c = fnG(c, d, a, b, M[15], 0xd8a1e681, 14) - b = fnG(b, c, d, a, M[4], 0xe7d3fbc8, 20) - a = fnG(a, b, c, d, M[9], 0x21e1cde6, 5) - d = fnG(d, a, b, c, M[14], 0xc33707d6, 9) - c = fnG(c, d, a, b, M[3], 0xf4d50d87, 14) - b = fnG(b, c, d, a, M[8], 0x455a14ed, 20) - a = fnG(a, b, c, d, M[13], 0xa9e3e905, 5) - d = fnG(d, a, b, c, M[2], 0xfcefa3f8, 9) - c = fnG(c, d, a, b, M[7], 0x676f02d9, 14) - b = fnG(b, c, d, a, M[12], 0x8d2a4c8a, 20) - - a = fnH(a, b, c, d, M[5], 0xfffa3942, 4) - d = fnH(d, a, b, c, M[8], 0x8771f681, 11) - c = fnH(c, d, a, b, M[11], 0x6d9d6122, 16) - b = fnH(b, c, d, a, M[14], 0xfde5380c, 23) - a = fnH(a, b, c, d, M[1], 0xa4beea44, 4) - d = fnH(d, a, b, c, M[4], 0x4bdecfa9, 11) - c = fnH(c, d, a, b, M[7], 0xf6bb4b60, 16) - b = fnH(b, c, d, a, M[10], 0xbebfbc70, 23) - a = fnH(a, b, c, d, M[13], 0x289b7ec6, 4) - d = fnH(d, a, b, c, M[0], 0xeaa127fa, 11) - c = fnH(c, d, a, b, M[3], 0xd4ef3085, 16) - b = fnH(b, c, d, a, M[6], 0x04881d05, 23) - a = fnH(a, b, c, d, M[9], 0xd9d4d039, 4) - d = fnH(d, a, b, c, M[12], 0xe6db99e5, 11) - c = fnH(c, d, a, b, M[15], 0x1fa27cf8, 16) - b = fnH(b, c, d, a, M[2], 0xc4ac5665, 23) - - a = fnI(a, b, c, d, M[0], 0xf4292244, 6) - d = fnI(d, a, b, c, M[7], 0x432aff97, 10) - c = fnI(c, d, a, b, M[14], 0xab9423a7, 15) - b = fnI(b, c, d, a, M[5], 0xfc93a039, 21) - a = fnI(a, b, c, d, M[12], 0x655b59c3, 6) - d = fnI(d, a, b, c, M[3], 0x8f0ccc92, 10) - c = fnI(c, d, a, b, M[10], 0xffeff47d, 15) - b = fnI(b, c, d, a, M[1], 0x85845dd1, 21) - a = fnI(a, b, c, d, M[8], 0x6fa87e4f, 6) - d = fnI(d, a, b, c, M[15], 0xfe2ce6e0, 10) - c = fnI(c, d, a, b, M[6], 0xa3014314, 15) - b = fnI(b, c, d, a, M[13], 0x4e0811a1, 21) - a = fnI(a, b, c, d, M[4], 0xf7537e82, 6) - d = fnI(d, a, b, c, M[11], 0xbd3af235, 10) - c = fnI(c, d, a, b, M[2], 0x2ad7d2bb, 15) - b = fnI(b, c, d, a, M[9], 0xeb86d391, 21) - - this._a = (this._a + a) | 0 - this._b = (this._b + b) | 0 - this._c = (this._c + c) | 0 - this._d = (this._d + d) | 0 -} - -MD5.prototype._digest = function () { - // create padding and handle blocks - this._block[this._blockOffset++] = 0x80 - if (this._blockOffset > 56) { - this._block.fill(0, this._blockOffset, 64) - this._update() - this._blockOffset = 0 - } - - this._block.fill(0, this._blockOffset, 56) - this._block.writeUInt32LE(this._length[0], 56) - this._block.writeUInt32LE(this._length[1], 60) - this._update() - - // produce result - var buffer = Buffer.allocUnsafe(16) - buffer.writeInt32LE(this._a, 0) - buffer.writeInt32LE(this._b, 4) - buffer.writeInt32LE(this._c, 8) - buffer.writeInt32LE(this._d, 12) - return buffer -} - -function rotl (x, n) { - return (x << n) | (x >>> (32 - n)) -} - -function fnF (a, b, c, d, m, k, s) { - return (rotl((a + ((b & c) | ((~b) & d)) + m + k) | 0, s) + b) | 0 -} - -function fnG (a, b, c, d, m, k, s) { - return (rotl((a + ((b & d) | (c & (~d))) + m + k) | 0, s) + b) | 0 -} - -function fnH (a, b, c, d, m, k, s) { - return (rotl((a + (b ^ c ^ d) + m + k) | 0, s) + b) | 0 -} - -function fnI (a, b, c, d, m, k, s) { - return (rotl((a + ((c ^ (b | (~d)))) + m + k) | 0, s) + b) | 0 -} - -module.exports = MD5 - -},{"inherits":"Bm0n","hash-base":"UcQW","safe-buffer":"Wugr"}],"quyi":[function(require,module,exports) { - -'use strict' -var Buffer = require('buffer').Buffer -var inherits = require('inherits') -var HashBase = require('hash-base') - -var ARRAY16 = new Array(16) - -var zl = [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, - 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, - 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, - 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13 -] - -var zr = [ - 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, - 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, - 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, - 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, - 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11 -] - -var sl = [ - 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, - 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, - 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, - 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, - 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 -] - -var sr = [ - 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, - 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, - 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, - 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, - 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 -] - -var hl = [0x00000000, 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xa953fd4e] -var hr = [0x50a28be6, 0x5c4dd124, 0x6d703ef3, 0x7a6d76e9, 0x00000000] - -function RIPEMD160 () { - HashBase.call(this, 64) - - // state - this._a = 0x67452301 - this._b = 0xefcdab89 - this._c = 0x98badcfe - this._d = 0x10325476 - this._e = 0xc3d2e1f0 -} - -inherits(RIPEMD160, HashBase) - -RIPEMD160.prototype._update = function () { - var words = ARRAY16 - for (var j = 0; j < 16; ++j) words[j] = this._block.readInt32LE(j * 4) - - var al = this._a | 0 - var bl = this._b | 0 - var cl = this._c | 0 - var dl = this._d | 0 - var el = this._e | 0 - - var ar = this._a | 0 - var br = this._b | 0 - var cr = this._c | 0 - var dr = this._d | 0 - var er = this._e | 0 - - // computation - for (var i = 0; i < 80; i += 1) { - var tl - var tr - if (i < 16) { - tl = fn1(al, bl, cl, dl, el, words[zl[i]], hl[0], sl[i]) - tr = fn5(ar, br, cr, dr, er, words[zr[i]], hr[0], sr[i]) - } else if (i < 32) { - tl = fn2(al, bl, cl, dl, el, words[zl[i]], hl[1], sl[i]) - tr = fn4(ar, br, cr, dr, er, words[zr[i]], hr[1], sr[i]) - } else if (i < 48) { - tl = fn3(al, bl, cl, dl, el, words[zl[i]], hl[2], sl[i]) - tr = fn3(ar, br, cr, dr, er, words[zr[i]], hr[2], sr[i]) - } else if (i < 64) { - tl = fn4(al, bl, cl, dl, el, words[zl[i]], hl[3], sl[i]) - tr = fn2(ar, br, cr, dr, er, words[zr[i]], hr[3], sr[i]) - } else { // if (i<80) { - tl = fn5(al, bl, cl, dl, el, words[zl[i]], hl[4], sl[i]) - tr = fn1(ar, br, cr, dr, er, words[zr[i]], hr[4], sr[i]) - } - - al = el - el = dl - dl = rotl(cl, 10) - cl = bl - bl = tl - - ar = er - er = dr - dr = rotl(cr, 10) - cr = br - br = tr - } - - // update state - var t = (this._b + cl + dr) | 0 - this._b = (this._c + dl + er) | 0 - this._c = (this._d + el + ar) | 0 - this._d = (this._e + al + br) | 0 - this._e = (this._a + bl + cr) | 0 - this._a = t -} - -RIPEMD160.prototype._digest = function () { - // create padding and handle blocks - this._block[this._blockOffset++] = 0x80 - if (this._blockOffset > 56) { - this._block.fill(0, this._blockOffset, 64) - this._update() - this._blockOffset = 0 - } - - this._block.fill(0, this._blockOffset, 56) - this._block.writeUInt32LE(this._length[0], 56) - this._block.writeUInt32LE(this._length[1], 60) - this._update() - - // produce result - var buffer = Buffer.alloc ? Buffer.alloc(20) : new Buffer(20) - buffer.writeInt32LE(this._a, 0) - buffer.writeInt32LE(this._b, 4) - buffer.writeInt32LE(this._c, 8) - buffer.writeInt32LE(this._d, 12) - buffer.writeInt32LE(this._e, 16) - return buffer -} - -function rotl (x, n) { - return (x << n) | (x >>> (32 - n)) -} - -function fn1 (a, b, c, d, e, m, k, s) { - return (rotl((a + (b ^ c ^ d) + m + k) | 0, s) + e) | 0 -} - -function fn2 (a, b, c, d, e, m, k, s) { - return (rotl((a + ((b & c) | ((~b) & d)) + m + k) | 0, s) + e) | 0 -} - -function fn3 (a, b, c, d, e, m, k, s) { - return (rotl((a + ((b | (~c)) ^ d) + m + k) | 0, s) + e) | 0 -} - -function fn4 (a, b, c, d, e, m, k, s) { - return (rotl((a + ((b & d) | (c & (~d))) + m + k) | 0, s) + e) | 0 -} - -function fn5 (a, b, c, d, e, m, k, s) { - return (rotl((a + (b ^ (c | (~d))) + m + k) | 0, s) + e) | 0 -} - -module.exports = RIPEMD160 - -},{"buffer":"dskh","inherits":"Bm0n","hash-base":"UcQW"}],"VHby":[function(require,module,exports) { - -var Buffer = require('safe-buffer').Buffer - -// prototype class for hash functions -function Hash (blockSize, finalSize) { - this._block = Buffer.alloc(blockSize) - this._finalSize = finalSize - this._blockSize = blockSize - this._len = 0 -} - -Hash.prototype.update = function (data, enc) { - if (typeof data === 'string') { - enc = enc || 'utf8' - data = Buffer.from(data, enc) - } - - var block = this._block - var blockSize = this._blockSize - var length = data.length - var accum = this._len - - for (var offset = 0; offset < length;) { - var assigned = accum % blockSize - var remainder = Math.min(length - offset, blockSize - assigned) - - for (var i = 0; i < remainder; i++) { - block[assigned + i] = data[offset + i] - } - - accum += remainder - offset += remainder - - if ((accum % blockSize) === 0) { - this._update(block) - } - } - - this._len += length - return this -} - -Hash.prototype.digest = function (enc) { - var rem = this._len % this._blockSize - - this._block[rem] = 0x80 - - // zero (rem + 1) trailing bits, where (rem + 1) is the smallest - // non-negative solution to the equation (length + 1 + (rem + 1)) === finalSize mod blockSize - this._block.fill(0, rem + 1) - - if (rem >= this._finalSize) { - this._update(this._block) - this._block.fill(0) - } - - var bits = this._len * 8 - - // uint32 - if (bits <= 0xffffffff) { - this._block.writeUInt32BE(bits, this._blockSize - 4) - - // uint64 - } else { - var lowBits = (bits & 0xffffffff) >>> 0 - var highBits = (bits - lowBits) / 0x100000000 - - this._block.writeUInt32BE(highBits, this._blockSize - 8) - this._block.writeUInt32BE(lowBits, this._blockSize - 4) - } - - this._update(this._block) - var hash = this._hash() - - return enc ? hash.toString(enc) : hash -} - -Hash.prototype._update = function () { - throw new Error('_update must be implemented by subclass') -} - -module.exports = Hash - -},{"safe-buffer":"Wugr"}],"j9dE":[function(require,module,exports) { - -/* - * A JavaScript implementation of the Secure Hash Algorithm, SHA-0, as defined - * in FIPS PUB 180-1 - * This source code is derived from sha1.js of the same repository. - * The difference between SHA-0 and SHA-1 is just a bitwise rotate left - * operation was added. - */ - -var inherits = require('inherits') -var Hash = require('./hash') -var Buffer = require('safe-buffer').Buffer - -var K = [ - 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc | 0, 0xca62c1d6 | 0 -] - -var W = new Array(80) - -function Sha () { - this.init() - this._w = W - - Hash.call(this, 64, 56) -} - -inherits(Sha, Hash) - -Sha.prototype.init = function () { - this._a = 0x67452301 - this._b = 0xefcdab89 - this._c = 0x98badcfe - this._d = 0x10325476 - this._e = 0xc3d2e1f0 - - return this -} - -function rotl5 (num) { - return (num << 5) | (num >>> 27) -} - -function rotl30 (num) { - return (num << 30) | (num >>> 2) -} - -function ft (s, b, c, d) { - if (s === 0) return (b & c) | ((~b) & d) - if (s === 2) return (b & c) | (b & d) | (c & d) - return b ^ c ^ d -} - -Sha.prototype._update = function (M) { - var W = this._w - - var a = this._a | 0 - var b = this._b | 0 - var c = this._c | 0 - var d = this._d | 0 - var e = this._e | 0 - - for (var i = 0; i < 16; ++i) W[i] = M.readInt32BE(i * 4) - for (; i < 80; ++i) W[i] = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16] - - for (var j = 0; j < 80; ++j) { - var s = ~~(j / 20) - var t = (rotl5(a) + ft(s, b, c, d) + e + W[j] + K[s]) | 0 - - e = d - d = c - c = rotl30(b) - b = a - a = t - } - - this._a = (a + this._a) | 0 - this._b = (b + this._b) | 0 - this._c = (c + this._c) | 0 - this._d = (d + this._d) | 0 - this._e = (e + this._e) | 0 -} - -Sha.prototype._hash = function () { - var H = Buffer.allocUnsafe(20) - - H.writeInt32BE(this._a | 0, 0) - H.writeInt32BE(this._b | 0, 4) - H.writeInt32BE(this._c | 0, 8) - H.writeInt32BE(this._d | 0, 12) - H.writeInt32BE(this._e | 0, 16) - - return H -} - -module.exports = Sha - -},{"inherits":"Bm0n","./hash":"VHby","safe-buffer":"Wugr"}],"oPH4":[function(require,module,exports) { - -/* - * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined - * in FIPS PUB 180-1 - * Version 2.1a Copyright Paul Johnston 2000 - 2002. - * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet - * Distributed under the BSD License - * See http://pajhome.org.uk/crypt/md5 for details. - */ - -var inherits = require('inherits') -var Hash = require('./hash') -var Buffer = require('safe-buffer').Buffer - -var K = [ - 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc | 0, 0xca62c1d6 | 0 -] - -var W = new Array(80) - -function Sha1 () { - this.init() - this._w = W - - Hash.call(this, 64, 56) -} - -inherits(Sha1, Hash) - -Sha1.prototype.init = function () { - this._a = 0x67452301 - this._b = 0xefcdab89 - this._c = 0x98badcfe - this._d = 0x10325476 - this._e = 0xc3d2e1f0 - - return this -} - -function rotl1 (num) { - return (num << 1) | (num >>> 31) -} - -function rotl5 (num) { - return (num << 5) | (num >>> 27) -} - -function rotl30 (num) { - return (num << 30) | (num >>> 2) -} - -function ft (s, b, c, d) { - if (s === 0) return (b & c) | ((~b) & d) - if (s === 2) return (b & c) | (b & d) | (c & d) - return b ^ c ^ d -} - -Sha1.prototype._update = function (M) { - var W = this._w - - var a = this._a | 0 - var b = this._b | 0 - var c = this._c | 0 - var d = this._d | 0 - var e = this._e | 0 - - for (var i = 0; i < 16; ++i) W[i] = M.readInt32BE(i * 4) - for (; i < 80; ++i) W[i] = rotl1(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]) - - for (var j = 0; j < 80; ++j) { - var s = ~~(j / 20) - var t = (rotl5(a) + ft(s, b, c, d) + e + W[j] + K[s]) | 0 - - e = d - d = c - c = rotl30(b) - b = a - a = t - } - - this._a = (a + this._a) | 0 - this._b = (b + this._b) | 0 - this._c = (c + this._c) | 0 - this._d = (d + this._d) | 0 - this._e = (e + this._e) | 0 -} - -Sha1.prototype._hash = function () { - var H = Buffer.allocUnsafe(20) - - H.writeInt32BE(this._a | 0, 0) - H.writeInt32BE(this._b | 0, 4) - H.writeInt32BE(this._c | 0, 8) - H.writeInt32BE(this._d | 0, 12) - H.writeInt32BE(this._e | 0, 16) - - return H -} - -module.exports = Sha1 - -},{"inherits":"Bm0n","./hash":"VHby","safe-buffer":"Wugr"}],"IUSb":[function(require,module,exports) { - -/** - * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined - * in FIPS 180-2 - * Version 2.2-beta Copyright Angel Marin, Paul Johnston 2000 - 2009. - * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet - * - */ - -var inherits = require('inherits') -var Hash = require('./hash') -var Buffer = require('safe-buffer').Buffer - -var K = [ - 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, - 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, - 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, - 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, - 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, - 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, - 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, - 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967, - 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, - 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, - 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, - 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, - 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, - 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, - 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, - 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2 -] - -var W = new Array(64) - -function Sha256 () { - this.init() - - this._w = W // new Array(64) - - Hash.call(this, 64, 56) -} - -inherits(Sha256, Hash) - -Sha256.prototype.init = function () { - this._a = 0x6a09e667 - this._b = 0xbb67ae85 - this._c = 0x3c6ef372 - this._d = 0xa54ff53a - this._e = 0x510e527f - this._f = 0x9b05688c - this._g = 0x1f83d9ab - this._h = 0x5be0cd19 - - return this -} - -function ch (x, y, z) { - return z ^ (x & (y ^ z)) -} - -function maj (x, y, z) { - return (x & y) | (z & (x | y)) -} - -function sigma0 (x) { - return (x >>> 2 | x << 30) ^ (x >>> 13 | x << 19) ^ (x >>> 22 | x << 10) -} - -function sigma1 (x) { - return (x >>> 6 | x << 26) ^ (x >>> 11 | x << 21) ^ (x >>> 25 | x << 7) -} - -function gamma0 (x) { - return (x >>> 7 | x << 25) ^ (x >>> 18 | x << 14) ^ (x >>> 3) -} - -function gamma1 (x) { - return (x >>> 17 | x << 15) ^ (x >>> 19 | x << 13) ^ (x >>> 10) -} - -Sha256.prototype._update = function (M) { - var W = this._w - - var a = this._a | 0 - var b = this._b | 0 - var c = this._c | 0 - var d = this._d | 0 - var e = this._e | 0 - var f = this._f | 0 - var g = this._g | 0 - var h = this._h | 0 - - for (var i = 0; i < 16; ++i) W[i] = M.readInt32BE(i * 4) - for (; i < 64; ++i) W[i] = (gamma1(W[i - 2]) + W[i - 7] + gamma0(W[i - 15]) + W[i - 16]) | 0 - - for (var j = 0; j < 64; ++j) { - var T1 = (h + sigma1(e) + ch(e, f, g) + K[j] + W[j]) | 0 - var T2 = (sigma0(a) + maj(a, b, c)) | 0 - - h = g - g = f - f = e - e = (d + T1) | 0 - d = c - c = b - b = a - a = (T1 + T2) | 0 - } - - this._a = (a + this._a) | 0 - this._b = (b + this._b) | 0 - this._c = (c + this._c) | 0 - this._d = (d + this._d) | 0 - this._e = (e + this._e) | 0 - this._f = (f + this._f) | 0 - this._g = (g + this._g) | 0 - this._h = (h + this._h) | 0 -} - -Sha256.prototype._hash = function () { - var H = Buffer.allocUnsafe(32) - - H.writeInt32BE(this._a, 0) - H.writeInt32BE(this._b, 4) - H.writeInt32BE(this._c, 8) - H.writeInt32BE(this._d, 12) - H.writeInt32BE(this._e, 16) - H.writeInt32BE(this._f, 20) - H.writeInt32BE(this._g, 24) - H.writeInt32BE(this._h, 28) - - return H -} - -module.exports = Sha256 - -},{"inherits":"Bm0n","./hash":"VHby","safe-buffer":"Wugr"}],"MeLE":[function(require,module,exports) { - -/** - * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined - * in FIPS 180-2 - * Version 2.2-beta Copyright Angel Marin, Paul Johnston 2000 - 2009. - * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet - * - */ - -var inherits = require('inherits') -var Sha256 = require('./sha256') -var Hash = require('./hash') -var Buffer = require('safe-buffer').Buffer - -var W = new Array(64) - -function Sha224 () { - this.init() - - this._w = W // new Array(64) - - Hash.call(this, 64, 56) -} - -inherits(Sha224, Sha256) - -Sha224.prototype.init = function () { - this._a = 0xc1059ed8 - this._b = 0x367cd507 - this._c = 0x3070dd17 - this._d = 0xf70e5939 - this._e = 0xffc00b31 - this._f = 0x68581511 - this._g = 0x64f98fa7 - this._h = 0xbefa4fa4 - - return this -} - -Sha224.prototype._hash = function () { - var H = Buffer.allocUnsafe(28) - - H.writeInt32BE(this._a, 0) - H.writeInt32BE(this._b, 4) - H.writeInt32BE(this._c, 8) - H.writeInt32BE(this._d, 12) - H.writeInt32BE(this._e, 16) - H.writeInt32BE(this._f, 20) - H.writeInt32BE(this._g, 24) - - return H -} - -module.exports = Sha224 - -},{"inherits":"Bm0n","./sha256":"IUSb","./hash":"VHby","safe-buffer":"Wugr"}],"sILY":[function(require,module,exports) { - -var inherits = require('inherits') -var Hash = require('./hash') -var Buffer = require('safe-buffer').Buffer - -var K = [ - 0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd, - 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc, - 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019, - 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118, - 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe, - 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2, - 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1, - 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694, - 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3, - 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65, - 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483, - 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5, - 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210, - 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4, - 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725, - 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70, - 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926, - 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df, - 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8, - 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b, - 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001, - 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30, - 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910, - 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8, - 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53, - 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8, - 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb, - 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3, - 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60, - 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec, - 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9, - 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b, - 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207, - 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178, - 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6, - 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b, - 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493, - 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c, - 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a, - 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817 -] - -var W = new Array(160) - -function Sha512 () { - this.init() - this._w = W - - Hash.call(this, 128, 112) -} - -inherits(Sha512, Hash) - -Sha512.prototype.init = function () { - this._ah = 0x6a09e667 - this._bh = 0xbb67ae85 - this._ch = 0x3c6ef372 - this._dh = 0xa54ff53a - this._eh = 0x510e527f - this._fh = 0x9b05688c - this._gh = 0x1f83d9ab - this._hh = 0x5be0cd19 - - this._al = 0xf3bcc908 - this._bl = 0x84caa73b - this._cl = 0xfe94f82b - this._dl = 0x5f1d36f1 - this._el = 0xade682d1 - this._fl = 0x2b3e6c1f - this._gl = 0xfb41bd6b - this._hl = 0x137e2179 - - return this -} - -function Ch (x, y, z) { - return z ^ (x & (y ^ z)) -} - -function maj (x, y, z) { - return (x & y) | (z & (x | y)) -} - -function sigma0 (x, xl) { - return (x >>> 28 | xl << 4) ^ (xl >>> 2 | x << 30) ^ (xl >>> 7 | x << 25) -} - -function sigma1 (x, xl) { - return (x >>> 14 | xl << 18) ^ (x >>> 18 | xl << 14) ^ (xl >>> 9 | x << 23) -} - -function Gamma0 (x, xl) { - return (x >>> 1 | xl << 31) ^ (x >>> 8 | xl << 24) ^ (x >>> 7) -} - -function Gamma0l (x, xl) { - return (x >>> 1 | xl << 31) ^ (x >>> 8 | xl << 24) ^ (x >>> 7 | xl << 25) -} - -function Gamma1 (x, xl) { - return (x >>> 19 | xl << 13) ^ (xl >>> 29 | x << 3) ^ (x >>> 6) -} - -function Gamma1l (x, xl) { - return (x >>> 19 | xl << 13) ^ (xl >>> 29 | x << 3) ^ (x >>> 6 | xl << 26) -} - -function getCarry (a, b) { - return (a >>> 0) < (b >>> 0) ? 1 : 0 -} - -Sha512.prototype._update = function (M) { - var W = this._w - - var ah = this._ah | 0 - var bh = this._bh | 0 - var ch = this._ch | 0 - var dh = this._dh | 0 - var eh = this._eh | 0 - var fh = this._fh | 0 - var gh = this._gh | 0 - var hh = this._hh | 0 - - var al = this._al | 0 - var bl = this._bl | 0 - var cl = this._cl | 0 - var dl = this._dl | 0 - var el = this._el | 0 - var fl = this._fl | 0 - var gl = this._gl | 0 - var hl = this._hl | 0 - - for (var i = 0; i < 32; i += 2) { - W[i] = M.readInt32BE(i * 4) - W[i + 1] = M.readInt32BE(i * 4 + 4) - } - for (; i < 160; i += 2) { - var xh = W[i - 15 * 2] - var xl = W[i - 15 * 2 + 1] - var gamma0 = Gamma0(xh, xl) - var gamma0l = Gamma0l(xl, xh) - - xh = W[i - 2 * 2] - xl = W[i - 2 * 2 + 1] - var gamma1 = Gamma1(xh, xl) - var gamma1l = Gamma1l(xl, xh) - - // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16] - var Wi7h = W[i - 7 * 2] - var Wi7l = W[i - 7 * 2 + 1] - - var Wi16h = W[i - 16 * 2] - var Wi16l = W[i - 16 * 2 + 1] - - var Wil = (gamma0l + Wi7l) | 0 - var Wih = (gamma0 + Wi7h + getCarry(Wil, gamma0l)) | 0 - Wil = (Wil + gamma1l) | 0 - Wih = (Wih + gamma1 + getCarry(Wil, gamma1l)) | 0 - Wil = (Wil + Wi16l) | 0 - Wih = (Wih + Wi16h + getCarry(Wil, Wi16l)) | 0 - - W[i] = Wih - W[i + 1] = Wil - } - - for (var j = 0; j < 160; j += 2) { - Wih = W[j] - Wil = W[j + 1] - - var majh = maj(ah, bh, ch) - var majl = maj(al, bl, cl) - - var sigma0h = sigma0(ah, al) - var sigma0l = sigma0(al, ah) - var sigma1h = sigma1(eh, el) - var sigma1l = sigma1(el, eh) - - // t1 = h + sigma1 + ch + K[j] + W[j] - var Kih = K[j] - var Kil = K[j + 1] - - var chh = Ch(eh, fh, gh) - var chl = Ch(el, fl, gl) - - var t1l = (hl + sigma1l) | 0 - var t1h = (hh + sigma1h + getCarry(t1l, hl)) | 0 - t1l = (t1l + chl) | 0 - t1h = (t1h + chh + getCarry(t1l, chl)) | 0 - t1l = (t1l + Kil) | 0 - t1h = (t1h + Kih + getCarry(t1l, Kil)) | 0 - t1l = (t1l + Wil) | 0 - t1h = (t1h + Wih + getCarry(t1l, Wil)) | 0 - - // t2 = sigma0 + maj - var t2l = (sigma0l + majl) | 0 - var t2h = (sigma0h + majh + getCarry(t2l, sigma0l)) | 0 - - hh = gh - hl = gl - gh = fh - gl = fl - fh = eh - fl = el - el = (dl + t1l) | 0 - eh = (dh + t1h + getCarry(el, dl)) | 0 - dh = ch - dl = cl - ch = bh - cl = bl - bh = ah - bl = al - al = (t1l + t2l) | 0 - ah = (t1h + t2h + getCarry(al, t1l)) | 0 - } - - this._al = (this._al + al) | 0 - this._bl = (this._bl + bl) | 0 - this._cl = (this._cl + cl) | 0 - this._dl = (this._dl + dl) | 0 - this._el = (this._el + el) | 0 - this._fl = (this._fl + fl) | 0 - this._gl = (this._gl + gl) | 0 - this._hl = (this._hl + hl) | 0 - - this._ah = (this._ah + ah + getCarry(this._al, al)) | 0 - this._bh = (this._bh + bh + getCarry(this._bl, bl)) | 0 - this._ch = (this._ch + ch + getCarry(this._cl, cl)) | 0 - this._dh = (this._dh + dh + getCarry(this._dl, dl)) | 0 - this._eh = (this._eh + eh + getCarry(this._el, el)) | 0 - this._fh = (this._fh + fh + getCarry(this._fl, fl)) | 0 - this._gh = (this._gh + gh + getCarry(this._gl, gl)) | 0 - this._hh = (this._hh + hh + getCarry(this._hl, hl)) | 0 -} - -Sha512.prototype._hash = function () { - var H = Buffer.allocUnsafe(64) - - function writeInt64BE (h, l, offset) { - H.writeInt32BE(h, offset) - H.writeInt32BE(l, offset + 4) - } - - writeInt64BE(this._ah, this._al, 0) - writeInt64BE(this._bh, this._bl, 8) - writeInt64BE(this._ch, this._cl, 16) - writeInt64BE(this._dh, this._dl, 24) - writeInt64BE(this._eh, this._el, 32) - writeInt64BE(this._fh, this._fl, 40) - writeInt64BE(this._gh, this._gl, 48) - writeInt64BE(this._hh, this._hl, 56) - - return H -} - -module.exports = Sha512 - -},{"inherits":"Bm0n","./hash":"VHby","safe-buffer":"Wugr"}],"V2o3":[function(require,module,exports) { - -var inherits = require('inherits') -var SHA512 = require('./sha512') -var Hash = require('./hash') -var Buffer = require('safe-buffer').Buffer - -var W = new Array(160) - -function Sha384 () { - this.init() - this._w = W - - Hash.call(this, 128, 112) -} - -inherits(Sha384, SHA512) - -Sha384.prototype.init = function () { - this._ah = 0xcbbb9d5d - this._bh = 0x629a292a - this._ch = 0x9159015a - this._dh = 0x152fecd8 - this._eh = 0x67332667 - this._fh = 0x8eb44a87 - this._gh = 0xdb0c2e0d - this._hh = 0x47b5481d - - this._al = 0xc1059ed8 - this._bl = 0x367cd507 - this._cl = 0x3070dd17 - this._dl = 0xf70e5939 - this._el = 0xffc00b31 - this._fl = 0x68581511 - this._gl = 0x64f98fa7 - this._hl = 0xbefa4fa4 - - return this -} - -Sha384.prototype._hash = function () { - var H = Buffer.allocUnsafe(48) - - function writeInt64BE (h, l, offset) { - H.writeInt32BE(h, offset) - H.writeInt32BE(l, offset + 4) - } - - writeInt64BE(this._ah, this._al, 0) - writeInt64BE(this._bh, this._bl, 8) - writeInt64BE(this._ch, this._cl, 16) - writeInt64BE(this._dh, this._dl, 24) - writeInt64BE(this._eh, this._el, 32) - writeInt64BE(this._fh, this._fl, 40) - - return H -} - -module.exports = Sha384 - -},{"inherits":"Bm0n","./sha512":"sILY","./hash":"VHby","safe-buffer":"Wugr"}],"t0b9":[function(require,module,exports) { -var exports = module.exports = function SHA (algorithm) { - algorithm = algorithm.toLowerCase() - - var Algorithm = exports[algorithm] - if (!Algorithm) throw new Error(algorithm + ' is not supported (we accept pull requests)') - - return new Algorithm() -} - -exports.sha = require('./sha') -exports.sha1 = require('./sha1') -exports.sha224 = require('./sha224') -exports.sha256 = require('./sha256') -exports.sha384 = require('./sha384') -exports.sha512 = require('./sha512') - -},{"./sha":"j9dE","./sha1":"oPH4","./sha224":"MeLE","./sha256":"IUSb","./sha384":"V2o3","./sha512":"sILY"}],"z0rv":[function(require,module,exports) { - -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -'use strict'; - -/**/ - -var Buffer = require('safe-buffer').Buffer; -/**/ - -var isEncoding = Buffer.isEncoding || function (encoding) { - encoding = '' + encoding; - switch (encoding && encoding.toLowerCase()) { - case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': - return true; - default: - return false; - } -}; - -function _normalizeEncoding(enc) { - if (!enc) return 'utf8'; - var retried; - while (true) { - switch (enc) { - case 'utf8': - case 'utf-8': - return 'utf8'; - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return 'utf16le'; - case 'latin1': - case 'binary': - return 'latin1'; - case 'base64': - case 'ascii': - case 'hex': - return enc; - default: - if (retried) return; // undefined - enc = ('' + enc).toLowerCase(); - retried = true; - } - } -}; - -// Do not cache `Buffer.isEncoding` when checking encoding names as some -// modules monkey-patch it to support additional encodings -function normalizeEncoding(enc) { - var nenc = _normalizeEncoding(enc); - if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); - return nenc || enc; -} - -// StringDecoder provides an interface for efficiently splitting a series of -// buffers into a series of JS strings without breaking apart multi-byte -// characters. -exports.StringDecoder = StringDecoder; -function StringDecoder(encoding) { - this.encoding = normalizeEncoding(encoding); - var nb; - switch (this.encoding) { - case 'utf16le': - this.text = utf16Text; - this.end = utf16End; - nb = 4; - break; - case 'utf8': - this.fillLast = utf8FillLast; - nb = 4; - break; - case 'base64': - this.text = base64Text; - this.end = base64End; - nb = 3; - break; - default: - this.write = simpleWrite; - this.end = simpleEnd; - return; - } - this.lastNeed = 0; - this.lastTotal = 0; - this.lastChar = Buffer.allocUnsafe(nb); -} - -StringDecoder.prototype.write = function (buf) { - if (buf.length === 0) return ''; - var r; - var i; - if (this.lastNeed) { - r = this.fillLast(buf); - if (r === undefined) return ''; - i = this.lastNeed; - this.lastNeed = 0; - } else { - i = 0; - } - if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); - return r || ''; -}; - -StringDecoder.prototype.end = utf8End; - -// Returns only complete characters in a Buffer -StringDecoder.prototype.text = utf8Text; - -// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer -StringDecoder.prototype.fillLast = function (buf) { - if (this.lastNeed <= buf.length) { - buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); - return this.lastChar.toString(this.encoding, 0, this.lastTotal); - } - buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); - this.lastNeed -= buf.length; -}; - -// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a -// continuation byte. If an invalid byte is detected, -2 is returned. -function utf8CheckByte(byte) { - if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; - return byte >> 6 === 0x02 ? -1 : -2; -} - -// Checks at most 3 bytes at the end of a Buffer in order to detect an -// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) -// needed to complete the UTF-8 character (if applicable) are returned. -function utf8CheckIncomplete(self, buf, i) { - var j = buf.length - 1; - if (j < i) return 0; - var nb = utf8CheckByte(buf[j]); - if (nb >= 0) { - if (nb > 0) self.lastNeed = nb - 1; - return nb; - } - if (--j < i || nb === -2) return 0; - nb = utf8CheckByte(buf[j]); - if (nb >= 0) { - if (nb > 0) self.lastNeed = nb - 2; - return nb; - } - if (--j < i || nb === -2) return 0; - nb = utf8CheckByte(buf[j]); - if (nb >= 0) { - if (nb > 0) { - if (nb === 2) nb = 0;else self.lastNeed = nb - 3; - } - return nb; - } - return 0; -} - -// Validates as many continuation bytes for a multi-byte UTF-8 character as -// needed or are available. If we see a non-continuation byte where we expect -// one, we "replace" the validated continuation bytes we've seen so far with -// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding -// behavior. The continuation byte check is included three times in the case -// where all of the continuation bytes for a character exist in the same buffer. -// It is also done this way as a slight performance increase instead of using a -// loop. -function utf8CheckExtraBytes(self, buf, p) { - if ((buf[0] & 0xC0) !== 0x80) { - self.lastNeed = 0; - return '\ufffd'; - } - if (self.lastNeed > 1 && buf.length > 1) { - if ((buf[1] & 0xC0) !== 0x80) { - self.lastNeed = 1; - return '\ufffd'; - } - if (self.lastNeed > 2 && buf.length > 2) { - if ((buf[2] & 0xC0) !== 0x80) { - self.lastNeed = 2; - return '\ufffd'; - } - } - } -} - -// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. -function utf8FillLast(buf) { - var p = this.lastTotal - this.lastNeed; - var r = utf8CheckExtraBytes(this, buf, p); - if (r !== undefined) return r; - if (this.lastNeed <= buf.length) { - buf.copy(this.lastChar, p, 0, this.lastNeed); - return this.lastChar.toString(this.encoding, 0, this.lastTotal); - } - buf.copy(this.lastChar, p, 0, buf.length); - this.lastNeed -= buf.length; -} - -// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a -// partial character, the character's bytes are buffered until the required -// number of bytes are available. -function utf8Text(buf, i) { - var total = utf8CheckIncomplete(this, buf, i); - if (!this.lastNeed) return buf.toString('utf8', i); - this.lastTotal = total; - var end = buf.length - (total - this.lastNeed); - buf.copy(this.lastChar, 0, end); - return buf.toString('utf8', i, end); -} - -// For UTF-8, a replacement character is added when ending on a partial -// character. -function utf8End(buf) { - var r = buf && buf.length ? this.write(buf) : ''; - if (this.lastNeed) return r + '\ufffd'; - return r; -} - -// UTF-16LE typically needs two bytes per character, but even if we have an even -// number of bytes available, we need to check if we end on a leading/high -// surrogate. In that case, we need to wait for the next two bytes in order to -// decode the last character properly. -function utf16Text(buf, i) { - if ((buf.length - i) % 2 === 0) { - var r = buf.toString('utf16le', i); - if (r) { - var c = r.charCodeAt(r.length - 1); - if (c >= 0xD800 && c <= 0xDBFF) { - this.lastNeed = 2; - this.lastTotal = 4; - this.lastChar[0] = buf[buf.length - 2]; - this.lastChar[1] = buf[buf.length - 1]; - return r.slice(0, -1); - } - } - return r; - } - this.lastNeed = 1; - this.lastTotal = 2; - this.lastChar[0] = buf[buf.length - 1]; - return buf.toString('utf16le', i, buf.length - 1); -} - -// For UTF-16LE we do not explicitly append special replacement characters if we -// end on a partial character, we simply let v8 handle that. -function utf16End(buf) { - var r = buf && buf.length ? this.write(buf) : ''; - if (this.lastNeed) { - var end = this.lastTotal - this.lastNeed; - return r + this.lastChar.toString('utf16le', 0, end); - } - return r; -} - -function base64Text(buf, i) { - var n = (buf.length - i) % 3; - if (n === 0) return buf.toString('base64', i); - this.lastNeed = 3 - n; - this.lastTotal = 3; - if (n === 1) { - this.lastChar[0] = buf[buf.length - 1]; - } else { - this.lastChar[0] = buf[buf.length - 2]; - this.lastChar[1] = buf[buf.length - 1]; - } - return buf.toString('base64', i, buf.length - n); -} - -function base64End(buf) { - var r = buf && buf.length ? this.write(buf) : ''; - if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); - return r; -} - -// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) -function simpleWrite(buf) { - return buf.toString(this.encoding); -} - -function simpleEnd(buf) { - return buf && buf.length ? this.write(buf) : ''; -} -},{"safe-buffer":"Wugr"}],"bjfr":[function(require,module,exports) { - -var Buffer = require('safe-buffer').Buffer -var Transform = require('stream').Transform -var StringDecoder = require('string_decoder').StringDecoder -var inherits = require('inherits') - -function CipherBase (hashMode) { - Transform.call(this) - this.hashMode = typeof hashMode === 'string' - if (this.hashMode) { - this[hashMode] = this._finalOrDigest - } else { - this.final = this._finalOrDigest - } - if (this._final) { - this.__final = this._final - this._final = null - } - this._decoder = null - this._encoding = null -} -inherits(CipherBase, Transform) - -CipherBase.prototype.update = function (data, inputEnc, outputEnc) { - if (typeof data === 'string') { - data = Buffer.from(data, inputEnc) - } - - var outData = this._update(data) - if (this.hashMode) return this - - if (outputEnc) { - outData = this._toString(outData, outputEnc) - } - - return outData -} - -CipherBase.prototype.setAutoPadding = function () {} -CipherBase.prototype.getAuthTag = function () { - throw new Error('trying to get auth tag in unsupported state') -} - -CipherBase.prototype.setAuthTag = function () { - throw new Error('trying to set auth tag in unsupported state') -} - -CipherBase.prototype.setAAD = function () { - throw new Error('trying to set aad in unsupported state') -} - -CipherBase.prototype._transform = function (data, _, next) { - var err - try { - if (this.hashMode) { - this._update(data) - } else { - this.push(this._update(data)) - } - } catch (e) { - err = e - } finally { - next(err) - } -} -CipherBase.prototype._flush = function (done) { - var err - try { - this.push(this.__final()) - } catch (e) { - err = e - } - - done(err) -} -CipherBase.prototype._finalOrDigest = function (outputEnc) { - var outData = this.__final() || Buffer.alloc(0) - if (outputEnc) { - outData = this._toString(outData, outputEnc, true) - } - return outData -} - -CipherBase.prototype._toString = function (value, enc, fin) { - if (!this._decoder) { - this._decoder = new StringDecoder(enc) - this._encoding = enc - } - - if (this._encoding !== enc) throw new Error('can\'t switch encodings') - - var out = this._decoder.write(value) - if (fin) { - out += this._decoder.end() - } - - return out -} - -module.exports = CipherBase - -},{"safe-buffer":"Wugr","stream":"fnRj","string_decoder":"z0rv","inherits":"Bm0n"}],"LF8r":[function(require,module,exports) { -'use strict' -var inherits = require('inherits') -var MD5 = require('md5.js') -var RIPEMD160 = require('ripemd160') -var sha = require('sha.js') -var Base = require('cipher-base') - -function Hash (hash) { - Base.call(this, 'digest') - - this._hash = hash -} - -inherits(Hash, Base) - -Hash.prototype._update = function (data) { - this._hash.update(data) -} - -Hash.prototype._final = function () { - return this._hash.digest() -} - -module.exports = function createHash (alg) { - alg = alg.toLowerCase() - if (alg === 'md5') return new MD5() - if (alg === 'rmd160' || alg === 'ripemd160') return new RIPEMD160() - - return new Hash(sha(alg)) -} - -},{"inherits":"Bm0n","md5.js":"OP64","ripemd160":"quyi","sha.js":"t0b9","cipher-base":"bjfr"}],"aHbo":[function(require,module,exports) { - -'use strict' -var inherits = require('inherits') -var Buffer = require('safe-buffer').Buffer - -var Base = require('cipher-base') - -var ZEROS = Buffer.alloc(128) -var blocksize = 64 - -function Hmac (alg, key) { - Base.call(this, 'digest') - if (typeof key === 'string') { - key = Buffer.from(key) - } - - this._alg = alg - this._key = key - - if (key.length > blocksize) { - key = alg(key) - } else if (key.length < blocksize) { - key = Buffer.concat([key, ZEROS], blocksize) - } - - var ipad = this._ipad = Buffer.allocUnsafe(blocksize) - var opad = this._opad = Buffer.allocUnsafe(blocksize) - - for (var i = 0; i < blocksize; i++) { - ipad[i] = key[i] ^ 0x36 - opad[i] = key[i] ^ 0x5C - } - - this._hash = [ipad] -} - -inherits(Hmac, Base) - -Hmac.prototype._update = function (data) { - this._hash.push(data) -} - -Hmac.prototype._final = function () { - var h = this._alg(Buffer.concat(this._hash)) - return this._alg(Buffer.concat([this._opad, h])) -} -module.exports = Hmac - -},{"inherits":"Bm0n","safe-buffer":"Wugr","cipher-base":"bjfr"}],"Mobq":[function(require,module,exports) { -var MD5 = require('md5.js') - -module.exports = function (buffer) { - return new MD5().update(buffer).digest() -} - -},{"md5.js":"OP64"}],"Cx6S":[function(require,module,exports) { - -'use strict' -var inherits = require('inherits') -var Legacy = require('./legacy') -var Base = require('cipher-base') -var Buffer = require('safe-buffer').Buffer -var md5 = require('create-hash/md5') -var RIPEMD160 = require('ripemd160') - -var sha = require('sha.js') - -var ZEROS = Buffer.alloc(128) - -function Hmac (alg, key) { - Base.call(this, 'digest') - if (typeof key === 'string') { - key = Buffer.from(key) - } - - var blocksize = (alg === 'sha512' || alg === 'sha384') ? 128 : 64 - - this._alg = alg - this._key = key - if (key.length > blocksize) { - var hash = alg === 'rmd160' ? new RIPEMD160() : sha(alg) - key = hash.update(key).digest() - } else if (key.length < blocksize) { - key = Buffer.concat([key, ZEROS], blocksize) - } - - var ipad = this._ipad = Buffer.allocUnsafe(blocksize) - var opad = this._opad = Buffer.allocUnsafe(blocksize) - - for (var i = 0; i < blocksize; i++) { - ipad[i] = key[i] ^ 0x36 - opad[i] = key[i] ^ 0x5C - } - this._hash = alg === 'rmd160' ? new RIPEMD160() : sha(alg) - this._hash.update(ipad) -} - -inherits(Hmac, Base) - -Hmac.prototype._update = function (data) { - this._hash.update(data) -} - -Hmac.prototype._final = function () { - var h = this._hash.digest() - var hash = this._alg === 'rmd160' ? new RIPEMD160() : sha(this._alg) - return hash.update(this._opad).update(h).digest() -} - -module.exports = function createHmac (alg, key) { - alg = alg.toLowerCase() - if (alg === 'rmd160' || alg === 'ripemd160') { - return new Hmac('rmd160', key) - } - if (alg === 'md5') { - return new Legacy(md5, key) - } - return new Hmac(alg, key) -} - -},{"inherits":"Bm0n","./legacy":"aHbo","cipher-base":"bjfr","safe-buffer":"Wugr","create-hash/md5":"Mobq","ripemd160":"quyi","sha.js":"t0b9"}],"WoCp":[function(require,module,exports) { -module.exports = { - "sha224WithRSAEncryption": { - "sign": "rsa", - "hash": "sha224", - "id": "302d300d06096086480165030402040500041c" - }, - "RSA-SHA224": { - "sign": "ecdsa/rsa", - "hash": "sha224", - "id": "302d300d06096086480165030402040500041c" - }, - "sha256WithRSAEncryption": { - "sign": "rsa", - "hash": "sha256", - "id": "3031300d060960864801650304020105000420" - }, - "RSA-SHA256": { - "sign": "ecdsa/rsa", - "hash": "sha256", - "id": "3031300d060960864801650304020105000420" - }, - "sha384WithRSAEncryption": { - "sign": "rsa", - "hash": "sha384", - "id": "3041300d060960864801650304020205000430" - }, - "RSA-SHA384": { - "sign": "ecdsa/rsa", - "hash": "sha384", - "id": "3041300d060960864801650304020205000430" - }, - "sha512WithRSAEncryption": { - "sign": "rsa", - "hash": "sha512", - "id": "3051300d060960864801650304020305000440" - }, - "RSA-SHA512": { - "sign": "ecdsa/rsa", - "hash": "sha512", - "id": "3051300d060960864801650304020305000440" - }, - "RSA-SHA1": { - "sign": "rsa", - "hash": "sha1", - "id": "3021300906052b0e03021a05000414" - }, - "ecdsa-with-SHA1": { - "sign": "ecdsa", - "hash": "sha1", - "id": "" - }, - "sha256": { - "sign": "ecdsa", - "hash": "sha256", - "id": "" - }, - "sha224": { - "sign": "ecdsa", - "hash": "sha224", - "id": "" - }, - "sha384": { - "sign": "ecdsa", - "hash": "sha384", - "id": "" - }, - "sha512": { - "sign": "ecdsa", - "hash": "sha512", - "id": "" - }, - "DSA-SHA": { - "sign": "dsa", - "hash": "sha1", - "id": "" - }, - "DSA-SHA1": { - "sign": "dsa", - "hash": "sha1", - "id": "" - }, - "DSA": { - "sign": "dsa", - "hash": "sha1", - "id": "" - }, - "DSA-WITH-SHA224": { - "sign": "dsa", - "hash": "sha224", - "id": "" - }, - "DSA-SHA224": { - "sign": "dsa", - "hash": "sha224", - "id": "" - }, - "DSA-WITH-SHA256": { - "sign": "dsa", - "hash": "sha256", - "id": "" - }, - "DSA-SHA256": { - "sign": "dsa", - "hash": "sha256", - "id": "" - }, - "DSA-WITH-SHA384": { - "sign": "dsa", - "hash": "sha384", - "id": "" - }, - "DSA-SHA384": { - "sign": "dsa", - "hash": "sha384", - "id": "" - }, - "DSA-WITH-SHA512": { - "sign": "dsa", - "hash": "sha512", - "id": "" - }, - "DSA-SHA512": { - "sign": "dsa", - "hash": "sha512", - "id": "" - }, - "DSA-RIPEMD160": { - "sign": "dsa", - "hash": "rmd160", - "id": "" - }, - "ripemd160WithRSA": { - "sign": "rsa", - "hash": "rmd160", - "id": "3021300906052b2403020105000414" - }, - "RSA-RIPEMD160": { - "sign": "rsa", - "hash": "rmd160", - "id": "3021300906052b2403020105000414" - }, - "md5WithRSAEncryption": { - "sign": "rsa", - "hash": "md5", - "id": "3020300c06082a864886f70d020505000410" - }, - "RSA-MD5": { - "sign": "rsa", - "hash": "md5", - "id": "3020300c06082a864886f70d020505000410" - } -} -; -},{}],"YKr5":[function(require,module,exports) { -module.exports = require('./browser/algorithms.json') - -},{"./browser/algorithms.json":"WoCp"}],"Zu0X":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -var MAX_ALLOC = Math.pow(2, 30) - 1; // default in iojs - -function checkBuffer(buf, name) { - if (typeof buf !== 'string' && !Buffer.isBuffer(buf)) { - throw new TypeError(name + ' must be a buffer or string'); - } -} - -module.exports = function (password, salt, iterations, keylen) { - checkBuffer(password, 'Password'); - checkBuffer(salt, 'Salt'); - - if (typeof iterations !== 'number') { - throw new TypeError('Iterations not a number'); - } - - if (iterations < 0) { - throw new TypeError('Bad iterations'); - } - - if (typeof keylen !== 'number') { - throw new TypeError('Key length not a number'); - } - - if (keylen < 0 || keylen > MAX_ALLOC || keylen !== keylen) { - /* eslint no-self-compare: 0 */ - throw new TypeError('Bad key length'); - } -}; -},{"buffer":"dskh"}],"ATA7":[function(require,module,exports) { -var process = require("process"); -var defaultEncoding; -/* istanbul ignore next */ - -if (true) { - defaultEncoding = 'utf-8'; -} else { - var pVersionMajor = parseInt(process.version.split('.')[0].slice(1), 10); - defaultEncoding = pVersionMajor >= 6 ? 'utf-8' : 'binary'; -} - -module.exports = defaultEncoding; -},{"process":"pBGv"}],"yOuH":[function(require,module,exports) { - -var md5 = require('create-hash/md5'); - -var RIPEMD160 = require('ripemd160'); - -var sha = require('sha.js'); - -var checkParameters = require('./precondition'); - -var defaultEncoding = require('./default-encoding'); - -var Buffer = require('safe-buffer').Buffer; - -var ZEROS = Buffer.alloc(128); -var sizes = { - md5: 16, - sha1: 20, - sha224: 28, - sha256: 32, - sha384: 48, - sha512: 64, - rmd160: 20, - ripemd160: 20 -}; - -function Hmac(alg, key, saltLen) { - var hash = getDigest(alg); - var blocksize = alg === 'sha512' || alg === 'sha384' ? 128 : 64; - - if (key.length > blocksize) { - key = hash(key); - } else if (key.length < blocksize) { - key = Buffer.concat([key, ZEROS], blocksize); - } - - var ipad = Buffer.allocUnsafe(blocksize + sizes[alg]); - var opad = Buffer.allocUnsafe(blocksize + sizes[alg]); - - for (var i = 0; i < blocksize; i++) { - ipad[i] = key[i] ^ 0x36; - opad[i] = key[i] ^ 0x5C; - } - - var ipad1 = Buffer.allocUnsafe(blocksize + saltLen + 4); - ipad.copy(ipad1, 0, 0, blocksize); - this.ipad1 = ipad1; - this.ipad2 = ipad; - this.opad = opad; - this.alg = alg; - this.blocksize = blocksize; - this.hash = hash; - this.size = sizes[alg]; -} - -Hmac.prototype.run = function (data, ipad) { - data.copy(ipad, this.blocksize); - var h = this.hash(ipad); - h.copy(this.opad, this.blocksize); - return this.hash(this.opad); -}; - -function getDigest(alg) { - function shaFunc(data) { - return sha(alg).update(data).digest(); - } - - function rmd160Func(data) { - return new RIPEMD160().update(data).digest(); - } - - if (alg === 'rmd160' || alg === 'ripemd160') return rmd160Func; - if (alg === 'md5') return md5; - return shaFunc; -} - -function pbkdf2(password, salt, iterations, keylen, digest) { - checkParameters(password, salt, iterations, keylen); - if (!Buffer.isBuffer(password)) password = Buffer.from(password, defaultEncoding); - if (!Buffer.isBuffer(salt)) salt = Buffer.from(salt, defaultEncoding); - digest = digest || 'sha1'; - var hmac = new Hmac(digest, password, salt.length); - var DK = Buffer.allocUnsafe(keylen); - var block1 = Buffer.allocUnsafe(salt.length + 4); - salt.copy(block1, 0, 0, salt.length); - var destPos = 0; - var hLen = sizes[digest]; - var l = Math.ceil(keylen / hLen); - - for (var i = 1; i <= l; i++) { - block1.writeUInt32BE(i, salt.length); - var T = hmac.run(block1, hmac.ipad1); - var U = T; - - for (var j = 1; j < iterations; j++) { - U = hmac.run(U, hmac.ipad2); - - for (var k = 0; k < hLen; k++) T[k] ^= U[k]; - } - - T.copy(DK, destPos); - destPos += hLen; - } - - return DK; -} - -module.exports = pbkdf2; -},{"create-hash/md5":"Mobq","ripemd160":"quyi","sha.js":"t0b9","./precondition":"Zu0X","./default-encoding":"ATA7","safe-buffer":"Wugr"}],"Q3c6":[function(require,module,exports) { - -var global = arguments[3]; -var process = require("process"); -var checkParameters = require('./precondition'); - -var defaultEncoding = require('./default-encoding'); - -var sync = require('./sync'); - -var Buffer = require('safe-buffer').Buffer; - -var ZERO_BUF; -var subtle = global.crypto && global.crypto.subtle; -var toBrowser = { - 'sha': 'SHA-1', - 'sha-1': 'SHA-1', - 'sha1': 'SHA-1', - 'sha256': 'SHA-256', - 'sha-256': 'SHA-256', - 'sha384': 'SHA-384', - 'sha-384': 'SHA-384', - 'sha-512': 'SHA-512', - 'sha512': 'SHA-512' -}; -var checks = []; - -function checkNative(algo) { - if (global.process && !global.process.browser) { - return Promise.resolve(false); - } - - if (!subtle || !subtle.importKey || !subtle.deriveBits) { - return Promise.resolve(false); - } - - if (checks[algo] !== undefined) { - return checks[algo]; - } - - ZERO_BUF = ZERO_BUF || Buffer.alloc(8); - var prom = browserPbkdf2(ZERO_BUF, ZERO_BUF, 10, 128, algo).then(function () { - return true; - }).catch(function () { - return false; - }); - checks[algo] = prom; - return prom; -} - -function browserPbkdf2(password, salt, iterations, length, algo) { - return subtle.importKey('raw', password, { - name: 'PBKDF2' - }, false, ['deriveBits']).then(function (key) { - return subtle.deriveBits({ - name: 'PBKDF2', - salt: salt, - iterations: iterations, - hash: { - name: algo - } - }, key, length << 3); - }).then(function (res) { - return Buffer.from(res); - }); -} - -function resolvePromise(promise, callback) { - promise.then(function (out) { - process.nextTick(function () { - callback(null, out); - }); - }, function (e) { - process.nextTick(function () { - callback(e); - }); - }); -} - -module.exports = function (password, salt, iterations, keylen, digest, callback) { - if (typeof digest === 'function') { - callback = digest; - digest = undefined; - } - - digest = digest || 'sha1'; - var algo = toBrowser[digest.toLowerCase()]; - - if (!algo || typeof global.Promise !== 'function') { - return process.nextTick(function () { - var out; - - try { - out = sync(password, salt, iterations, keylen, digest); - } catch (e) { - return callback(e); - } - - callback(null, out); - }); - } - - checkParameters(password, salt, iterations, keylen); - if (typeof callback !== 'function') throw new Error('No callback provided to pbkdf2'); - if (!Buffer.isBuffer(password)) password = Buffer.from(password, defaultEncoding); - if (!Buffer.isBuffer(salt)) salt = Buffer.from(salt, defaultEncoding); - resolvePromise(checkNative(algo).then(function (resp) { - if (resp) return browserPbkdf2(password, salt, iterations, keylen, algo); - return sync(password, salt, iterations, keylen, digest); - }), callback); -}; -},{"./precondition":"Zu0X","./default-encoding":"ATA7","./sync":"yOuH","safe-buffer":"Wugr","process":"pBGv"}],"BKdu":[function(require,module,exports) { -exports.pbkdf2 = require('./lib/async'); -exports.pbkdf2Sync = require('./lib/sync'); -},{"./lib/async":"Q3c6","./lib/sync":"yOuH"}],"a957":[function(require,module,exports) { -'use strict'; - -exports.readUInt32BE = function readUInt32BE(bytes, off) { - var res = (bytes[0 + off] << 24) | - (bytes[1 + off] << 16) | - (bytes[2 + off] << 8) | - bytes[3 + off]; - return res >>> 0; -}; - -exports.writeUInt32BE = function writeUInt32BE(bytes, value, off) { - bytes[0 + off] = value >>> 24; - bytes[1 + off] = (value >>> 16) & 0xff; - bytes[2 + off] = (value >>> 8) & 0xff; - bytes[3 + off] = value & 0xff; -}; - -exports.ip = function ip(inL, inR, out, off) { - var outL = 0; - var outR = 0; - - for (var i = 6; i >= 0; i -= 2) { - for (var j = 0; j <= 24; j += 8) { - outL <<= 1; - outL |= (inR >>> (j + i)) & 1; - } - for (var j = 0; j <= 24; j += 8) { - outL <<= 1; - outL |= (inL >>> (j + i)) & 1; - } - } - - for (var i = 6; i >= 0; i -= 2) { - for (var j = 1; j <= 25; j += 8) { - outR <<= 1; - outR |= (inR >>> (j + i)) & 1; - } - for (var j = 1; j <= 25; j += 8) { - outR <<= 1; - outR |= (inL >>> (j + i)) & 1; - } - } - - out[off + 0] = outL >>> 0; - out[off + 1] = outR >>> 0; -}; - -exports.rip = function rip(inL, inR, out, off) { - var outL = 0; - var outR = 0; - - for (var i = 0; i < 4; i++) { - for (var j = 24; j >= 0; j -= 8) { - outL <<= 1; - outL |= (inR >>> (j + i)) & 1; - outL <<= 1; - outL |= (inL >>> (j + i)) & 1; - } - } - for (var i = 4; i < 8; i++) { - for (var j = 24; j >= 0; j -= 8) { - outR <<= 1; - outR |= (inR >>> (j + i)) & 1; - outR <<= 1; - outR |= (inL >>> (j + i)) & 1; - } - } - - out[off + 0] = outL >>> 0; - out[off + 1] = outR >>> 0; -}; - -exports.pc1 = function pc1(inL, inR, out, off) { - var outL = 0; - var outR = 0; - - // 7, 15, 23, 31, 39, 47, 55, 63 - // 6, 14, 22, 30, 39, 47, 55, 63 - // 5, 13, 21, 29, 39, 47, 55, 63 - // 4, 12, 20, 28 - for (var i = 7; i >= 5; i--) { - for (var j = 0; j <= 24; j += 8) { - outL <<= 1; - outL |= (inR >> (j + i)) & 1; - } - for (var j = 0; j <= 24; j += 8) { - outL <<= 1; - outL |= (inL >> (j + i)) & 1; - } - } - for (var j = 0; j <= 24; j += 8) { - outL <<= 1; - outL |= (inR >> (j + i)) & 1; - } - - // 1, 9, 17, 25, 33, 41, 49, 57 - // 2, 10, 18, 26, 34, 42, 50, 58 - // 3, 11, 19, 27, 35, 43, 51, 59 - // 36, 44, 52, 60 - for (var i = 1; i <= 3; i++) { - for (var j = 0; j <= 24; j += 8) { - outR <<= 1; - outR |= (inR >> (j + i)) & 1; - } - for (var j = 0; j <= 24; j += 8) { - outR <<= 1; - outR |= (inL >> (j + i)) & 1; - } - } - for (var j = 0; j <= 24; j += 8) { - outR <<= 1; - outR |= (inL >> (j + i)) & 1; - } - - out[off + 0] = outL >>> 0; - out[off + 1] = outR >>> 0; -}; - -exports.r28shl = function r28shl(num, shift) { - return ((num << shift) & 0xfffffff) | (num >>> (28 - shift)); -}; - -var pc2table = [ - // inL => outL - 14, 11, 17, 4, 27, 23, 25, 0, - 13, 22, 7, 18, 5, 9, 16, 24, - 2, 20, 12, 21, 1, 8, 15, 26, - - // inR => outR - 15, 4, 25, 19, 9, 1, 26, 16, - 5, 11, 23, 8, 12, 7, 17, 0, - 22, 3, 10, 14, 6, 20, 27, 24 -]; - -exports.pc2 = function pc2(inL, inR, out, off) { - var outL = 0; - var outR = 0; - - var len = pc2table.length >>> 1; - for (var i = 0; i < len; i++) { - outL <<= 1; - outL |= (inL >>> pc2table[i]) & 0x1; - } - for (var i = len; i < pc2table.length; i++) { - outR <<= 1; - outR |= (inR >>> pc2table[i]) & 0x1; - } - - out[off + 0] = outL >>> 0; - out[off + 1] = outR >>> 0; -}; - -exports.expand = function expand(r, out, off) { - var outL = 0; - var outR = 0; - - outL = ((r & 1) << 5) | (r >>> 27); - for (var i = 23; i >= 15; i -= 4) { - outL <<= 6; - outL |= (r >>> i) & 0x3f; - } - for (var i = 11; i >= 3; i -= 4) { - outR |= (r >>> i) & 0x3f; - outR <<= 6; - } - outR |= ((r & 0x1f) << 1) | (r >>> 31); - - out[off + 0] = outL >>> 0; - out[off + 1] = outR >>> 0; -}; - -var sTable = [ - 14, 0, 4, 15, 13, 7, 1, 4, 2, 14, 15, 2, 11, 13, 8, 1, - 3, 10, 10, 6, 6, 12, 12, 11, 5, 9, 9, 5, 0, 3, 7, 8, - 4, 15, 1, 12, 14, 8, 8, 2, 13, 4, 6, 9, 2, 1, 11, 7, - 15, 5, 12, 11, 9, 3, 7, 14, 3, 10, 10, 0, 5, 6, 0, 13, - - 15, 3, 1, 13, 8, 4, 14, 7, 6, 15, 11, 2, 3, 8, 4, 14, - 9, 12, 7, 0, 2, 1, 13, 10, 12, 6, 0, 9, 5, 11, 10, 5, - 0, 13, 14, 8, 7, 10, 11, 1, 10, 3, 4, 15, 13, 4, 1, 2, - 5, 11, 8, 6, 12, 7, 6, 12, 9, 0, 3, 5, 2, 14, 15, 9, - - 10, 13, 0, 7, 9, 0, 14, 9, 6, 3, 3, 4, 15, 6, 5, 10, - 1, 2, 13, 8, 12, 5, 7, 14, 11, 12, 4, 11, 2, 15, 8, 1, - 13, 1, 6, 10, 4, 13, 9, 0, 8, 6, 15, 9, 3, 8, 0, 7, - 11, 4, 1, 15, 2, 14, 12, 3, 5, 11, 10, 5, 14, 2, 7, 12, - - 7, 13, 13, 8, 14, 11, 3, 5, 0, 6, 6, 15, 9, 0, 10, 3, - 1, 4, 2, 7, 8, 2, 5, 12, 11, 1, 12, 10, 4, 14, 15, 9, - 10, 3, 6, 15, 9, 0, 0, 6, 12, 10, 11, 1, 7, 13, 13, 8, - 15, 9, 1, 4, 3, 5, 14, 11, 5, 12, 2, 7, 8, 2, 4, 14, - - 2, 14, 12, 11, 4, 2, 1, 12, 7, 4, 10, 7, 11, 13, 6, 1, - 8, 5, 5, 0, 3, 15, 15, 10, 13, 3, 0, 9, 14, 8, 9, 6, - 4, 11, 2, 8, 1, 12, 11, 7, 10, 1, 13, 14, 7, 2, 8, 13, - 15, 6, 9, 15, 12, 0, 5, 9, 6, 10, 3, 4, 0, 5, 14, 3, - - 12, 10, 1, 15, 10, 4, 15, 2, 9, 7, 2, 12, 6, 9, 8, 5, - 0, 6, 13, 1, 3, 13, 4, 14, 14, 0, 7, 11, 5, 3, 11, 8, - 9, 4, 14, 3, 15, 2, 5, 12, 2, 9, 8, 5, 12, 15, 3, 10, - 7, 11, 0, 14, 4, 1, 10, 7, 1, 6, 13, 0, 11, 8, 6, 13, - - 4, 13, 11, 0, 2, 11, 14, 7, 15, 4, 0, 9, 8, 1, 13, 10, - 3, 14, 12, 3, 9, 5, 7, 12, 5, 2, 10, 15, 6, 8, 1, 6, - 1, 6, 4, 11, 11, 13, 13, 8, 12, 1, 3, 4, 7, 10, 14, 7, - 10, 9, 15, 5, 6, 0, 8, 15, 0, 14, 5, 2, 9, 3, 2, 12, - - 13, 1, 2, 15, 8, 13, 4, 8, 6, 10, 15, 3, 11, 7, 1, 4, - 10, 12, 9, 5, 3, 6, 14, 11, 5, 0, 0, 14, 12, 9, 7, 2, - 7, 2, 11, 1, 4, 14, 1, 7, 9, 4, 12, 10, 14, 8, 2, 13, - 0, 15, 6, 12, 10, 9, 13, 0, 15, 3, 3, 5, 5, 6, 8, 11 -]; - -exports.substitute = function substitute(inL, inR) { - var out = 0; - for (var i = 0; i < 4; i++) { - var b = (inL >>> (18 - i * 6)) & 0x3f; - var sb = sTable[i * 0x40 + b]; - - out <<= 4; - out |= sb; - } - for (var i = 0; i < 4; i++) { - var b = (inR >>> (18 - i * 6)) & 0x3f; - var sb = sTable[4 * 0x40 + i * 0x40 + b]; - - out <<= 4; - out |= sb; - } - return out >>> 0; -}; - -var permuteTable = [ - 16, 25, 12, 11, 3, 20, 4, 15, 31, 17, 9, 6, 27, 14, 1, 22, - 30, 24, 8, 18, 0, 5, 29, 23, 13, 19, 2, 26, 10, 21, 28, 7 -]; - -exports.permute = function permute(num) { - var out = 0; - for (var i = 0; i < permuteTable.length; i++) { - out <<= 1; - out |= (num >>> permuteTable[i]) & 0x1; - } - return out >>> 0; -}; - -exports.padSplit = function padSplit(num, size, group) { - var str = num.toString(2); - while (str.length < size) - str = '0' + str; - - var out = []; - for (var i = 0; i < size; i += group) - out.push(str.slice(i, i + group)); - return out.join(' '); -}; - -},{}],"eTzy":[function(require,module,exports) { -'use strict'; - -var assert = require('minimalistic-assert'); - -function Cipher(options) { - this.options = options; - - this.type = this.options.type; - this.blockSize = 8; - this._init(); - - this.buffer = new Array(this.blockSize); - this.bufferOff = 0; -} -module.exports = Cipher; - -Cipher.prototype._init = function _init() { - // Might be overrided -}; - -Cipher.prototype.update = function update(data) { - if (data.length === 0) - return []; - - if (this.type === 'decrypt') - return this._updateDecrypt(data); - else - return this._updateEncrypt(data); -}; - -Cipher.prototype._buffer = function _buffer(data, off) { - // Append data to buffer - var min = Math.min(this.buffer.length - this.bufferOff, data.length - off); - for (var i = 0; i < min; i++) - this.buffer[this.bufferOff + i] = data[off + i]; - this.bufferOff += min; - - // Shift next - return min; -}; - -Cipher.prototype._flushBuffer = function _flushBuffer(out, off) { - this._update(this.buffer, 0, out, off); - this.bufferOff = 0; - return this.blockSize; -}; - -Cipher.prototype._updateEncrypt = function _updateEncrypt(data) { - var inputOff = 0; - var outputOff = 0; - - var count = ((this.bufferOff + data.length) / this.blockSize) | 0; - var out = new Array(count * this.blockSize); - - if (this.bufferOff !== 0) { - inputOff += this._buffer(data, inputOff); - - if (this.bufferOff === this.buffer.length) - outputOff += this._flushBuffer(out, outputOff); - } - - // Write blocks - var max = data.length - ((data.length - inputOff) % this.blockSize); - for (; inputOff < max; inputOff += this.blockSize) { - this._update(data, inputOff, out, outputOff); - outputOff += this.blockSize; - } - - // Queue rest - for (; inputOff < data.length; inputOff++, this.bufferOff++) - this.buffer[this.bufferOff] = data[inputOff]; - - return out; -}; - -Cipher.prototype._updateDecrypt = function _updateDecrypt(data) { - var inputOff = 0; - var outputOff = 0; - - var count = Math.ceil((this.bufferOff + data.length) / this.blockSize) - 1; - var out = new Array(count * this.blockSize); - - // TODO(indutny): optimize it, this is far from optimal - for (; count > 0; count--) { - inputOff += this._buffer(data, inputOff); - outputOff += this._flushBuffer(out, outputOff); - } - - // Buffer rest of the input - inputOff += this._buffer(data, inputOff); - - return out; -}; - -Cipher.prototype.final = function final(buffer) { - var first; - if (buffer) - first = this.update(buffer); - - var last; - if (this.type === 'encrypt') - last = this._finalEncrypt(); - else - last = this._finalDecrypt(); - - if (first) - return first.concat(last); - else - return last; -}; - -Cipher.prototype._pad = function _pad(buffer, off) { - if (off === 0) - return false; - - while (off < buffer.length) - buffer[off++] = 0; - - return true; -}; - -Cipher.prototype._finalEncrypt = function _finalEncrypt() { - if (!this._pad(this.buffer, this.bufferOff)) - return []; - - var out = new Array(this.blockSize); - this._update(this.buffer, 0, out, 0); - return out; -}; - -Cipher.prototype._unpad = function _unpad(buffer) { - return buffer; -}; - -Cipher.prototype._finalDecrypt = function _finalDecrypt() { - assert.equal(this.bufferOff, this.blockSize, 'Not enough data to decrypt'); - var out = new Array(this.blockSize); - this._flushBuffer(out, 0); - - return this._unpad(out); -}; - -},{"minimalistic-assert":"MpuC"}],"UVxA":[function(require,module,exports) { -'use strict'; - -var assert = require('minimalistic-assert'); -var inherits = require('inherits'); - -var des = require('../des'); -var utils = des.utils; -var Cipher = des.Cipher; - -function DESState() { - this.tmp = new Array(2); - this.keys = null; -} - -function DES(options) { - Cipher.call(this, options); - - var state = new DESState(); - this._desState = state; - - this.deriveKeys(state, options.key); -} -inherits(DES, Cipher); -module.exports = DES; - -DES.create = function create(options) { - return new DES(options); -}; - -var shiftTable = [ - 1, 1, 2, 2, 2, 2, 2, 2, - 1, 2, 2, 2, 2, 2, 2, 1 -]; - -DES.prototype.deriveKeys = function deriveKeys(state, key) { - state.keys = new Array(16 * 2); - - assert.equal(key.length, this.blockSize, 'Invalid key length'); - - var kL = utils.readUInt32BE(key, 0); - var kR = utils.readUInt32BE(key, 4); - - utils.pc1(kL, kR, state.tmp, 0); - kL = state.tmp[0]; - kR = state.tmp[1]; - for (var i = 0; i < state.keys.length; i += 2) { - var shift = shiftTable[i >>> 1]; - kL = utils.r28shl(kL, shift); - kR = utils.r28shl(kR, shift); - utils.pc2(kL, kR, state.keys, i); - } -}; - -DES.prototype._update = function _update(inp, inOff, out, outOff) { - var state = this._desState; - - var l = utils.readUInt32BE(inp, inOff); - var r = utils.readUInt32BE(inp, inOff + 4); - - // Initial Permutation - utils.ip(l, r, state.tmp, 0); - l = state.tmp[0]; - r = state.tmp[1]; - - if (this.type === 'encrypt') - this._encrypt(state, l, r, state.tmp, 0); - else - this._decrypt(state, l, r, state.tmp, 0); - - l = state.tmp[0]; - r = state.tmp[1]; - - utils.writeUInt32BE(out, l, outOff); - utils.writeUInt32BE(out, r, outOff + 4); -}; - -DES.prototype._pad = function _pad(buffer, off) { - var value = buffer.length - off; - for (var i = off; i < buffer.length; i++) - buffer[i] = value; - - return true; -}; - -DES.prototype._unpad = function _unpad(buffer) { - var pad = buffer[buffer.length - 1]; - for (var i = buffer.length - pad; i < buffer.length; i++) - assert.equal(buffer[i], pad); - - return buffer.slice(0, buffer.length - pad); -}; - -DES.prototype._encrypt = function _encrypt(state, lStart, rStart, out, off) { - var l = lStart; - var r = rStart; - - // Apply f() x16 times - for (var i = 0; i < state.keys.length; i += 2) { - var keyL = state.keys[i]; - var keyR = state.keys[i + 1]; - - // f(r, k) - utils.expand(r, state.tmp, 0); - - keyL ^= state.tmp[0]; - keyR ^= state.tmp[1]; - var s = utils.substitute(keyL, keyR); - var f = utils.permute(s); - - var t = r; - r = (l ^ f) >>> 0; - l = t; - } - - // Reverse Initial Permutation - utils.rip(r, l, out, off); -}; - -DES.prototype._decrypt = function _decrypt(state, lStart, rStart, out, off) { - var l = rStart; - var r = lStart; - - // Apply f() x16 times - for (var i = state.keys.length - 2; i >= 0; i -= 2) { - var keyL = state.keys[i]; - var keyR = state.keys[i + 1]; - - // f(r, k) - utils.expand(l, state.tmp, 0); - - keyL ^= state.tmp[0]; - keyR ^= state.tmp[1]; - var s = utils.substitute(keyL, keyR); - var f = utils.permute(s); - - var t = l; - l = (r ^ f) >>> 0; - r = t; - } - - // Reverse Initial Permutation - utils.rip(l, r, out, off); -}; - -},{"minimalistic-assert":"MpuC","inherits":"Bm0n","../des":"Tikc"}],"NN3V":[function(require,module,exports) { -'use strict'; - -var assert = require('minimalistic-assert'); -var inherits = require('inherits'); - -var proto = {}; - -function CBCState(iv) { - assert.equal(iv.length, 8, 'Invalid IV length'); - - this.iv = new Array(8); - for (var i = 0; i < this.iv.length; i++) - this.iv[i] = iv[i]; -} - -function instantiate(Base) { - function CBC(options) { - Base.call(this, options); - this._cbcInit(); - } - inherits(CBC, Base); - - var keys = Object.keys(proto); - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - CBC.prototype[key] = proto[key]; - } - - CBC.create = function create(options) { - return new CBC(options); - }; - - return CBC; -} - -exports.instantiate = instantiate; - -proto._cbcInit = function _cbcInit() { - var state = new CBCState(this.options.iv); - this._cbcState = state; -}; - -proto._update = function _update(inp, inOff, out, outOff) { - var state = this._cbcState; - var superProto = this.constructor.super_.prototype; - - var iv = state.iv; - if (this.type === 'encrypt') { - for (var i = 0; i < this.blockSize; i++) - iv[i] ^= inp[inOff + i]; - - superProto._update.call(this, iv, 0, out, outOff); - - for (var i = 0; i < this.blockSize; i++) - iv[i] = out[outOff + i]; - } else { - superProto._update.call(this, inp, inOff, out, outOff); - - for (var i = 0; i < this.blockSize; i++) - out[outOff + i] ^= iv[i]; - - for (var i = 0; i < this.blockSize; i++) - iv[i] = inp[inOff + i]; - } -}; - -},{"minimalistic-assert":"MpuC","inherits":"Bm0n"}],"jkwx":[function(require,module,exports) { -'use strict'; - -var assert = require('minimalistic-assert'); -var inherits = require('inherits'); - -var des = require('../des'); -var Cipher = des.Cipher; -var DES = des.DES; - -function EDEState(type, key) { - assert.equal(key.length, 24, 'Invalid key length'); - - var k1 = key.slice(0, 8); - var k2 = key.slice(8, 16); - var k3 = key.slice(16, 24); - - if (type === 'encrypt') { - this.ciphers = [ - DES.create({ type: 'encrypt', key: k1 }), - DES.create({ type: 'decrypt', key: k2 }), - DES.create({ type: 'encrypt', key: k3 }) - ]; - } else { - this.ciphers = [ - DES.create({ type: 'decrypt', key: k3 }), - DES.create({ type: 'encrypt', key: k2 }), - DES.create({ type: 'decrypt', key: k1 }) - ]; - } -} - -function EDE(options) { - Cipher.call(this, options); - - var state = new EDEState(this.type, this.options.key); - this._edeState = state; -} -inherits(EDE, Cipher); - -module.exports = EDE; - -EDE.create = function create(options) { - return new EDE(options); -}; - -EDE.prototype._update = function _update(inp, inOff, out, outOff) { - var state = this._edeState; - - state.ciphers[0]._update(inp, inOff, out, outOff); - state.ciphers[1]._update(out, outOff, out, outOff); - state.ciphers[2]._update(out, outOff, out, outOff); -}; - -EDE.prototype._pad = DES.prototype._pad; -EDE.prototype._unpad = DES.prototype._unpad; - -},{"minimalistic-assert":"MpuC","inherits":"Bm0n","../des":"Tikc"}],"Tikc":[function(require,module,exports) { -'use strict'; - -exports.utils = require('./des/utils'); -exports.Cipher = require('./des/cipher'); -exports.DES = require('./des/des'); -exports.CBC = require('./des/cbc'); -exports.EDE = require('./des/ede'); - -},{"./des/utils":"a957","./des/cipher":"eTzy","./des/des":"UVxA","./des/cbc":"NN3V","./des/ede":"jkwx"}],"sKVA":[function(require,module,exports) { - -var CipherBase = require('cipher-base') -var des = require('des.js') -var inherits = require('inherits') -var Buffer = require('safe-buffer').Buffer - -var modes = { - 'des-ede3-cbc': des.CBC.instantiate(des.EDE), - 'des-ede3': des.EDE, - 'des-ede-cbc': des.CBC.instantiate(des.EDE), - 'des-ede': des.EDE, - 'des-cbc': des.CBC.instantiate(des.DES), - 'des-ecb': des.DES -} -modes.des = modes['des-cbc'] -modes.des3 = modes['des-ede3-cbc'] -module.exports = DES -inherits(DES, CipherBase) -function DES (opts) { - CipherBase.call(this) - var modeName = opts.mode.toLowerCase() - var mode = modes[modeName] - var type - if (opts.decrypt) { - type = 'decrypt' - } else { - type = 'encrypt' - } - var key = opts.key - if (!Buffer.isBuffer(key)) { - key = Buffer.from(key) - } - if (modeName === 'des-ede' || modeName === 'des-ede-cbc') { - key = Buffer.concat([key, key.slice(0, 8)]) - } - var iv = opts.iv - if (!Buffer.isBuffer(iv)) { - iv = Buffer.from(iv) - } - this._des = mode.create({ - key: key, - iv: iv, - type: type - }) -} -DES.prototype._update = function (data) { - return Buffer.from(this._des.update(data)) -} -DES.prototype._final = function () { - return Buffer.from(this._des.final()) -} - -},{"cipher-base":"bjfr","des.js":"Tikc","inherits":"Bm0n","safe-buffer":"Wugr"}],"deTC":[function(require,module,exports) { -exports.encrypt = function (self, block) { - return self._cipher.encryptBlock(block) -} - -exports.decrypt = function (self, block) { - return self._cipher.decryptBlock(block) -} - -},{}],"Bi15":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -module.exports = function xor (a, b) { - var length = Math.min(a.length, b.length) - var buffer = new Buffer(length) - - for (var i = 0; i < length; ++i) { - buffer[i] = a[i] ^ b[i] - } - - return buffer -} - -},{"buffer":"dskh"}],"n4Db":[function(require,module,exports) { -var xor = require('buffer-xor') - -exports.encrypt = function (self, block) { - var data = xor(block, self._prev) - - self._prev = self._cipher.encryptBlock(data) - return self._prev -} - -exports.decrypt = function (self, block) { - var pad = self._prev - - self._prev = block - var out = self._cipher.decryptBlock(block) - - return xor(out, pad) -} - -},{"buffer-xor":"Bi15"}],"G0zN":[function(require,module,exports) { - -var Buffer = require('safe-buffer').Buffer -var xor = require('buffer-xor') - -function encryptStart (self, data, decrypt) { - var len = data.length - var out = xor(data, self._cache) - self._cache = self._cache.slice(len) - self._prev = Buffer.concat([self._prev, decrypt ? data : out]) - return out -} - -exports.encrypt = function (self, data, decrypt) { - var out = Buffer.allocUnsafe(0) - var len - - while (data.length) { - if (self._cache.length === 0) { - self._cache = self._cipher.encryptBlock(self._prev) - self._prev = Buffer.allocUnsafe(0) - } - - if (self._cache.length <= data.length) { - len = self._cache.length - out = Buffer.concat([out, encryptStart(self, data.slice(0, len), decrypt)]) - data = data.slice(len) - } else { - out = Buffer.concat([out, encryptStart(self, data, decrypt)]) - break - } - } - - return out -} - -},{"safe-buffer":"Wugr","buffer-xor":"Bi15"}],"GBMF":[function(require,module,exports) { - -var Buffer = require('safe-buffer').Buffer - -function encryptByte (self, byteParam, decrypt) { - var pad = self._cipher.encryptBlock(self._prev) - var out = pad[0] ^ byteParam - - self._prev = Buffer.concat([ - self._prev.slice(1), - Buffer.from([decrypt ? byteParam : out]) - ]) - - return out -} - -exports.encrypt = function (self, chunk, decrypt) { - var len = chunk.length - var out = Buffer.allocUnsafe(len) - var i = -1 - - while (++i < len) { - out[i] = encryptByte(self, chunk[i], decrypt) - } - - return out -} - -},{"safe-buffer":"Wugr"}],"JZn9":[function(require,module,exports) { - -var Buffer = require('safe-buffer').Buffer - -function encryptByte (self, byteParam, decrypt) { - var pad - var i = -1 - var len = 8 - var out = 0 - var bit, value - while (++i < len) { - pad = self._cipher.encryptBlock(self._prev) - bit = (byteParam & (1 << (7 - i))) ? 0x80 : 0 - value = pad[0] ^ bit - out += ((value & 0x80) >> (i % 8)) - self._prev = shiftIn(self._prev, decrypt ? bit : value) - } - return out -} - -function shiftIn (buffer, value) { - var len = buffer.length - var i = -1 - var out = Buffer.allocUnsafe(buffer.length) - buffer = Buffer.concat([buffer, Buffer.from([value])]) - - while (++i < len) { - out[i] = buffer[i] << 1 | buffer[i + 1] >> (7) - } - - return out -} - -exports.encrypt = function (self, chunk, decrypt) { - var len = chunk.length - var out = Buffer.allocUnsafe(len) - var i = -1 - - while (++i < len) { - out[i] = encryptByte(self, chunk[i], decrypt) - } - - return out -} - -},{"safe-buffer":"Wugr"}],"fJ7E":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -var xor = require('buffer-xor') - -function getBlock (self) { - self._prev = self._cipher.encryptBlock(self._prev) - return self._prev -} - -exports.encrypt = function (self, chunk) { - while (self._cache.length < chunk.length) { - self._cache = Buffer.concat([self._cache, getBlock(self)]) - } - - var pad = self._cache.slice(0, chunk.length) - self._cache = self._cache.slice(chunk.length) - return xor(chunk, pad) -} - -},{"buffer-xor":"Bi15","buffer":"dskh"}],"EFOV":[function(require,module,exports) { -function incr32 (iv) { - var len = iv.length - var item - while (len--) { - item = iv.readUInt8(len) - if (item === 255) { - iv.writeUInt8(0, len) - } else { - item++ - iv.writeUInt8(item, len) - break - } - } -} -module.exports = incr32 - -},{}],"Iyxz":[function(require,module,exports) { - -var xor = require('buffer-xor') -var Buffer = require('safe-buffer').Buffer -var incr32 = require('../incr32') - -function getBlock (self) { - var out = self._cipher.encryptBlockRaw(self._prev) - incr32(self._prev) - return out -} - -var blockSize = 16 -exports.encrypt = function (self, chunk) { - var chunkNum = Math.ceil(chunk.length / blockSize) - var start = self._cache.length - self._cache = Buffer.concat([ - self._cache, - Buffer.allocUnsafe(chunkNum * blockSize) - ]) - for (var i = 0; i < chunkNum; i++) { - var out = getBlock(self) - var offset = start + i * blockSize - self._cache.writeUInt32BE(out[0], offset + 0) - self._cache.writeUInt32BE(out[1], offset + 4) - self._cache.writeUInt32BE(out[2], offset + 8) - self._cache.writeUInt32BE(out[3], offset + 12) - } - var pad = self._cache.slice(0, chunk.length) - self._cache = self._cache.slice(chunk.length) - return xor(chunk, pad) -} - -},{"buffer-xor":"Bi15","safe-buffer":"Wugr","../incr32":"EFOV"}],"veqz":[function(require,module,exports) { -module.exports = { - "aes-128-ecb": { - "cipher": "AES", - "key": 128, - "iv": 0, - "mode": "ECB", - "type": "block" - }, - "aes-192-ecb": { - "cipher": "AES", - "key": 192, - "iv": 0, - "mode": "ECB", - "type": "block" - }, - "aes-256-ecb": { - "cipher": "AES", - "key": 256, - "iv": 0, - "mode": "ECB", - "type": "block" - }, - "aes-128-cbc": { - "cipher": "AES", - "key": 128, - "iv": 16, - "mode": "CBC", - "type": "block" - }, - "aes-192-cbc": { - "cipher": "AES", - "key": 192, - "iv": 16, - "mode": "CBC", - "type": "block" - }, - "aes-256-cbc": { - "cipher": "AES", - "key": 256, - "iv": 16, - "mode": "CBC", - "type": "block" - }, - "aes128": { - "cipher": "AES", - "key": 128, - "iv": 16, - "mode": "CBC", - "type": "block" - }, - "aes192": { - "cipher": "AES", - "key": 192, - "iv": 16, - "mode": "CBC", - "type": "block" - }, - "aes256": { - "cipher": "AES", - "key": 256, - "iv": 16, - "mode": "CBC", - "type": "block" - }, - "aes-128-cfb": { - "cipher": "AES", - "key": 128, - "iv": 16, - "mode": "CFB", - "type": "stream" - }, - "aes-192-cfb": { - "cipher": "AES", - "key": 192, - "iv": 16, - "mode": "CFB", - "type": "stream" - }, - "aes-256-cfb": { - "cipher": "AES", - "key": 256, - "iv": 16, - "mode": "CFB", - "type": "stream" - }, - "aes-128-cfb8": { - "cipher": "AES", - "key": 128, - "iv": 16, - "mode": "CFB8", - "type": "stream" - }, - "aes-192-cfb8": { - "cipher": "AES", - "key": 192, - "iv": 16, - "mode": "CFB8", - "type": "stream" - }, - "aes-256-cfb8": { - "cipher": "AES", - "key": 256, - "iv": 16, - "mode": "CFB8", - "type": "stream" - }, - "aes-128-cfb1": { - "cipher": "AES", - "key": 128, - "iv": 16, - "mode": "CFB1", - "type": "stream" - }, - "aes-192-cfb1": { - "cipher": "AES", - "key": 192, - "iv": 16, - "mode": "CFB1", - "type": "stream" - }, - "aes-256-cfb1": { - "cipher": "AES", - "key": 256, - "iv": 16, - "mode": "CFB1", - "type": "stream" - }, - "aes-128-ofb": { - "cipher": "AES", - "key": 128, - "iv": 16, - "mode": "OFB", - "type": "stream" - }, - "aes-192-ofb": { - "cipher": "AES", - "key": 192, - "iv": 16, - "mode": "OFB", - "type": "stream" - }, - "aes-256-ofb": { - "cipher": "AES", - "key": 256, - "iv": 16, - "mode": "OFB", - "type": "stream" - }, - "aes-128-ctr": { - "cipher": "AES", - "key": 128, - "iv": 16, - "mode": "CTR", - "type": "stream" - }, - "aes-192-ctr": { - "cipher": "AES", - "key": 192, - "iv": 16, - "mode": "CTR", - "type": "stream" - }, - "aes-256-ctr": { - "cipher": "AES", - "key": 256, - "iv": 16, - "mode": "CTR", - "type": "stream" - }, - "aes-128-gcm": { - "cipher": "AES", - "key": 128, - "iv": 12, - "mode": "GCM", - "type": "auth" - }, - "aes-192-gcm": { - "cipher": "AES", - "key": 192, - "iv": 12, - "mode": "GCM", - "type": "auth" - }, - "aes-256-gcm": { - "cipher": "AES", - "key": 256, - "iv": 12, - "mode": "GCM", - "type": "auth" - } -} -; -},{}],"zdSg":[function(require,module,exports) { -var modeModules = { - ECB: require('./ecb'), - CBC: require('./cbc'), - CFB: require('./cfb'), - CFB8: require('./cfb8'), - CFB1: require('./cfb1'), - OFB: require('./ofb'), - CTR: require('./ctr'), - GCM: require('./ctr') -} - -var modes = require('./list.json') - -for (var key in modes) { - modes[key].module = modeModules[modes[key].mode] -} - -module.exports = modes - -},{"./ecb":"deTC","./cbc":"n4Db","./cfb":"G0zN","./cfb8":"GBMF","./cfb1":"JZn9","./ofb":"fJ7E","./ctr":"Iyxz","./list.json":"veqz"}],"dNn4":[function(require,module,exports) { - -// based on the aes implimentation in triple sec -// https://github.com/keybase/triplesec -// which is in turn based on the one from crypto-js -// https://code.google.com/p/crypto-js/ - -var Buffer = require('safe-buffer').Buffer - -function asUInt32Array (buf) { - if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf) - - var len = (buf.length / 4) | 0 - var out = new Array(len) - - for (var i = 0; i < len; i++) { - out[i] = buf.readUInt32BE(i * 4) - } - - return out -} - -function scrubVec (v) { - for (var i = 0; i < v.length; v++) { - v[i] = 0 - } -} - -function cryptBlock (M, keySchedule, SUB_MIX, SBOX, nRounds) { - var SUB_MIX0 = SUB_MIX[0] - var SUB_MIX1 = SUB_MIX[1] - var SUB_MIX2 = SUB_MIX[2] - var SUB_MIX3 = SUB_MIX[3] - - var s0 = M[0] ^ keySchedule[0] - var s1 = M[1] ^ keySchedule[1] - var s2 = M[2] ^ keySchedule[2] - var s3 = M[3] ^ keySchedule[3] - var t0, t1, t2, t3 - var ksRow = 4 - - for (var round = 1; round < nRounds; round++) { - t0 = SUB_MIX0[s0 >>> 24] ^ SUB_MIX1[(s1 >>> 16) & 0xff] ^ SUB_MIX2[(s2 >>> 8) & 0xff] ^ SUB_MIX3[s3 & 0xff] ^ keySchedule[ksRow++] - t1 = SUB_MIX0[s1 >>> 24] ^ SUB_MIX1[(s2 >>> 16) & 0xff] ^ SUB_MIX2[(s3 >>> 8) & 0xff] ^ SUB_MIX3[s0 & 0xff] ^ keySchedule[ksRow++] - t2 = SUB_MIX0[s2 >>> 24] ^ SUB_MIX1[(s3 >>> 16) & 0xff] ^ SUB_MIX2[(s0 >>> 8) & 0xff] ^ SUB_MIX3[s1 & 0xff] ^ keySchedule[ksRow++] - t3 = SUB_MIX0[s3 >>> 24] ^ SUB_MIX1[(s0 >>> 16) & 0xff] ^ SUB_MIX2[(s1 >>> 8) & 0xff] ^ SUB_MIX3[s2 & 0xff] ^ keySchedule[ksRow++] - s0 = t0 - s1 = t1 - s2 = t2 - s3 = t3 - } - - t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++] - t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++] - t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++] - t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++] - t0 = t0 >>> 0 - t1 = t1 >>> 0 - t2 = t2 >>> 0 - t3 = t3 >>> 0 - - return [t0, t1, t2, t3] -} - -// AES constants -var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36] -var G = (function () { - // Compute double table - var d = new Array(256) - for (var j = 0; j < 256; j++) { - if (j < 128) { - d[j] = j << 1 - } else { - d[j] = (j << 1) ^ 0x11b - } - } - - var SBOX = [] - var INV_SBOX = [] - var SUB_MIX = [[], [], [], []] - var INV_SUB_MIX = [[], [], [], []] - - // Walk GF(2^8) - var x = 0 - var xi = 0 - for (var i = 0; i < 256; ++i) { - // Compute sbox - var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4) - sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63 - SBOX[x] = sx - INV_SBOX[sx] = x - - // Compute multiplication - var x2 = d[x] - var x4 = d[x2] - var x8 = d[x4] - - // Compute sub bytes, mix columns tables - var t = (d[sx] * 0x101) ^ (sx * 0x1010100) - SUB_MIX[0][x] = (t << 24) | (t >>> 8) - SUB_MIX[1][x] = (t << 16) | (t >>> 16) - SUB_MIX[2][x] = (t << 8) | (t >>> 24) - SUB_MIX[3][x] = t - - // Compute inv sub bytes, inv mix columns tables - t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100) - INV_SUB_MIX[0][sx] = (t << 24) | (t >>> 8) - INV_SUB_MIX[1][sx] = (t << 16) | (t >>> 16) - INV_SUB_MIX[2][sx] = (t << 8) | (t >>> 24) - INV_SUB_MIX[3][sx] = t - - if (x === 0) { - x = xi = 1 - } else { - x = x2 ^ d[d[d[x8 ^ x2]]] - xi ^= d[d[xi]] - } - } - - return { - SBOX: SBOX, - INV_SBOX: INV_SBOX, - SUB_MIX: SUB_MIX, - INV_SUB_MIX: INV_SUB_MIX - } -})() - -function AES (key) { - this._key = asUInt32Array(key) - this._reset() -} - -AES.blockSize = 4 * 4 -AES.keySize = 256 / 8 -AES.prototype.blockSize = AES.blockSize -AES.prototype.keySize = AES.keySize -AES.prototype._reset = function () { - var keyWords = this._key - var keySize = keyWords.length - var nRounds = keySize + 6 - var ksRows = (nRounds + 1) * 4 - - var keySchedule = [] - for (var k = 0; k < keySize; k++) { - keySchedule[k] = keyWords[k] - } - - for (k = keySize; k < ksRows; k++) { - var t = keySchedule[k - 1] - - if (k % keySize === 0) { - t = (t << 8) | (t >>> 24) - t = - (G.SBOX[t >>> 24] << 24) | - (G.SBOX[(t >>> 16) & 0xff] << 16) | - (G.SBOX[(t >>> 8) & 0xff] << 8) | - (G.SBOX[t & 0xff]) - - t ^= RCON[(k / keySize) | 0] << 24 - } else if (keySize > 6 && k % keySize === 4) { - t = - (G.SBOX[t >>> 24] << 24) | - (G.SBOX[(t >>> 16) & 0xff] << 16) | - (G.SBOX[(t >>> 8) & 0xff] << 8) | - (G.SBOX[t & 0xff]) - } - - keySchedule[k] = keySchedule[k - keySize] ^ t - } - - var invKeySchedule = [] - for (var ik = 0; ik < ksRows; ik++) { - var ksR = ksRows - ik - var tt = keySchedule[ksR - (ik % 4 ? 0 : 4)] - - if (ik < 4 || ksR <= 4) { - invKeySchedule[ik] = tt - } else { - invKeySchedule[ik] = - G.INV_SUB_MIX[0][G.SBOX[tt >>> 24]] ^ - G.INV_SUB_MIX[1][G.SBOX[(tt >>> 16) & 0xff]] ^ - G.INV_SUB_MIX[2][G.SBOX[(tt >>> 8) & 0xff]] ^ - G.INV_SUB_MIX[3][G.SBOX[tt & 0xff]] - } - } - - this._nRounds = nRounds - this._keySchedule = keySchedule - this._invKeySchedule = invKeySchedule -} - -AES.prototype.encryptBlockRaw = function (M) { - M = asUInt32Array(M) - return cryptBlock(M, this._keySchedule, G.SUB_MIX, G.SBOX, this._nRounds) -} - -AES.prototype.encryptBlock = function (M) { - var out = this.encryptBlockRaw(M) - var buf = Buffer.allocUnsafe(16) - buf.writeUInt32BE(out[0], 0) - buf.writeUInt32BE(out[1], 4) - buf.writeUInt32BE(out[2], 8) - buf.writeUInt32BE(out[3], 12) - return buf -} - -AES.prototype.decryptBlock = function (M) { - M = asUInt32Array(M) - - // swap - var m1 = M[1] - M[1] = M[3] - M[3] = m1 - - var out = cryptBlock(M, this._invKeySchedule, G.INV_SUB_MIX, G.INV_SBOX, this._nRounds) - var buf = Buffer.allocUnsafe(16) - buf.writeUInt32BE(out[0], 0) - buf.writeUInt32BE(out[3], 4) - buf.writeUInt32BE(out[2], 8) - buf.writeUInt32BE(out[1], 12) - return buf -} - -AES.prototype.scrub = function () { - scrubVec(this._keySchedule) - scrubVec(this._invKeySchedule) - scrubVec(this._key) -} - -module.exports.AES = AES - -},{"safe-buffer":"Wugr"}],"vgFu":[function(require,module,exports) { - -var Buffer = require('safe-buffer').Buffer -var ZEROES = Buffer.alloc(16, 0) - -function toArray (buf) { - return [ - buf.readUInt32BE(0), - buf.readUInt32BE(4), - buf.readUInt32BE(8), - buf.readUInt32BE(12) - ] -} - -function fromArray (out) { - var buf = Buffer.allocUnsafe(16) - buf.writeUInt32BE(out[0] >>> 0, 0) - buf.writeUInt32BE(out[1] >>> 0, 4) - buf.writeUInt32BE(out[2] >>> 0, 8) - buf.writeUInt32BE(out[3] >>> 0, 12) - return buf -} - -function GHASH (key) { - this.h = key - this.state = Buffer.alloc(16, 0) - this.cache = Buffer.allocUnsafe(0) -} - -// from http://bitwiseshiftleft.github.io/sjcl/doc/symbols/src/core_gcm.js.html -// by Juho Vähä-Herttua -GHASH.prototype.ghash = function (block) { - var i = -1 - while (++i < block.length) { - this.state[i] ^= block[i] - } - this._multiply() -} - -GHASH.prototype._multiply = function () { - var Vi = toArray(this.h) - var Zi = [0, 0, 0, 0] - var j, xi, lsbVi - var i = -1 - while (++i < 128) { - xi = (this.state[~~(i / 8)] & (1 << (7 - (i % 8)))) !== 0 - if (xi) { - // Z_i+1 = Z_i ^ V_i - Zi[0] ^= Vi[0] - Zi[1] ^= Vi[1] - Zi[2] ^= Vi[2] - Zi[3] ^= Vi[3] - } - - // Store the value of LSB(V_i) - lsbVi = (Vi[3] & 1) !== 0 - - // V_i+1 = V_i >> 1 - for (j = 3; j > 0; j--) { - Vi[j] = (Vi[j] >>> 1) | ((Vi[j - 1] & 1) << 31) - } - Vi[0] = Vi[0] >>> 1 - - // If LSB(V_i) is 1, V_i+1 = (V_i >> 1) ^ R - if (lsbVi) { - Vi[0] = Vi[0] ^ (0xe1 << 24) - } - } - this.state = fromArray(Zi) -} - -GHASH.prototype.update = function (buf) { - this.cache = Buffer.concat([this.cache, buf]) - var chunk - while (this.cache.length >= 16) { - chunk = this.cache.slice(0, 16) - this.cache = this.cache.slice(16) - this.ghash(chunk) - } -} - -GHASH.prototype.final = function (abl, bl) { - if (this.cache.length) { - this.ghash(Buffer.concat([this.cache, ZEROES], 16)) - } - - this.ghash(fromArray([0, abl, 0, bl])) - return this.state -} - -module.exports = GHASH - -},{"safe-buffer":"Wugr"}],"KDZf":[function(require,module,exports) { - -var aes = require('./aes') -var Buffer = require('safe-buffer').Buffer -var Transform = require('cipher-base') -var inherits = require('inherits') -var GHASH = require('./ghash') -var xor = require('buffer-xor') -var incr32 = require('./incr32') - -function xorTest (a, b) { - var out = 0 - if (a.length !== b.length) out++ - - var len = Math.min(a.length, b.length) - for (var i = 0; i < len; ++i) { - out += (a[i] ^ b[i]) - } - - return out -} - -function calcIv (self, iv, ck) { - if (iv.length === 12) { - self._finID = Buffer.concat([iv, Buffer.from([0, 0, 0, 1])]) - return Buffer.concat([iv, Buffer.from([0, 0, 0, 2])]) - } - var ghash = new GHASH(ck) - var len = iv.length - var toPad = len % 16 - ghash.update(iv) - if (toPad) { - toPad = 16 - toPad - ghash.update(Buffer.alloc(toPad, 0)) - } - ghash.update(Buffer.alloc(8, 0)) - var ivBits = len * 8 - var tail = Buffer.alloc(8) - tail.writeUIntBE(ivBits, 0, 8) - ghash.update(tail) - self._finID = ghash.state - var out = Buffer.from(self._finID) - incr32(out) - return out -} -function StreamCipher (mode, key, iv, decrypt) { - Transform.call(this) - - var h = Buffer.alloc(4, 0) - - this._cipher = new aes.AES(key) - var ck = this._cipher.encryptBlock(h) - this._ghash = new GHASH(ck) - iv = calcIv(this, iv, ck) - - this._prev = Buffer.from(iv) - this._cache = Buffer.allocUnsafe(0) - this._secCache = Buffer.allocUnsafe(0) - this._decrypt = decrypt - this._alen = 0 - this._len = 0 - this._mode = mode - - this._authTag = null - this._called = false -} - -inherits(StreamCipher, Transform) - -StreamCipher.prototype._update = function (chunk) { - if (!this._called && this._alen) { - var rump = 16 - (this._alen % 16) - if (rump < 16) { - rump = Buffer.alloc(rump, 0) - this._ghash.update(rump) - } - } - - this._called = true - var out = this._mode.encrypt(this, chunk) - if (this._decrypt) { - this._ghash.update(chunk) - } else { - this._ghash.update(out) - } - this._len += chunk.length - return out -} - -StreamCipher.prototype._final = function () { - if (this._decrypt && !this._authTag) throw new Error('Unsupported state or unable to authenticate data') - - var tag = xor(this._ghash.final(this._alen * 8, this._len * 8), this._cipher.encryptBlock(this._finID)) - if (this._decrypt && xorTest(tag, this._authTag)) throw new Error('Unsupported state or unable to authenticate data') - - this._authTag = tag - this._cipher.scrub() -} - -StreamCipher.prototype.getAuthTag = function getAuthTag () { - if (this._decrypt || !Buffer.isBuffer(this._authTag)) throw new Error('Attempting to get auth tag in unsupported state') - - return this._authTag -} - -StreamCipher.prototype.setAuthTag = function setAuthTag (tag) { - if (!this._decrypt) throw new Error('Attempting to set auth tag in unsupported state') - - this._authTag = tag -} - -StreamCipher.prototype.setAAD = function setAAD (buf) { - if (this._called) throw new Error('Attempting to set AAD in unsupported state') - - this._ghash.update(buf) - this._alen += buf.length -} - -module.exports = StreamCipher - -},{"./aes":"dNn4","safe-buffer":"Wugr","cipher-base":"bjfr","inherits":"Bm0n","./ghash":"vgFu","buffer-xor":"Bi15","./incr32":"EFOV"}],"XmsB":[function(require,module,exports) { - -var aes = require('./aes') -var Buffer = require('safe-buffer').Buffer -var Transform = require('cipher-base') -var inherits = require('inherits') - -function StreamCipher (mode, key, iv, decrypt) { - Transform.call(this) - - this._cipher = new aes.AES(key) - this._prev = Buffer.from(iv) - this._cache = Buffer.allocUnsafe(0) - this._secCache = Buffer.allocUnsafe(0) - this._decrypt = decrypt - this._mode = mode -} - -inherits(StreamCipher, Transform) - -StreamCipher.prototype._update = function (chunk) { - return this._mode.encrypt(this, chunk, this._decrypt) -} - -StreamCipher.prototype._final = function () { - this._cipher.scrub() -} - -module.exports = StreamCipher - -},{"./aes":"dNn4","safe-buffer":"Wugr","cipher-base":"bjfr","inherits":"Bm0n"}],"exU6":[function(require,module,exports) { - -var Buffer = require('safe-buffer').Buffer -var MD5 = require('md5.js') - -/* eslint-disable camelcase */ -function EVP_BytesToKey (password, salt, keyBits, ivLen) { - if (!Buffer.isBuffer(password)) password = Buffer.from(password, 'binary') - if (salt) { - if (!Buffer.isBuffer(salt)) salt = Buffer.from(salt, 'binary') - if (salt.length !== 8) throw new RangeError('salt should be Buffer with 8 byte length') - } - - var keyLen = keyBits / 8 - var key = Buffer.alloc(keyLen) - var iv = Buffer.alloc(ivLen || 0) - var tmp = Buffer.alloc(0) - - while (keyLen > 0 || ivLen > 0) { - var hash = new MD5() - hash.update(tmp) - hash.update(password) - if (salt) hash.update(salt) - tmp = hash.digest() - - var used = 0 - - if (keyLen > 0) { - var keyStart = key.length - keyLen - used = Math.min(keyLen, tmp.length) - tmp.copy(key, keyStart, 0, used) - keyLen -= used - } - - if (used < tmp.length && ivLen > 0) { - var ivStart = iv.length - ivLen - var length = Math.min(ivLen, tmp.length - used) - tmp.copy(iv, ivStart, used, used + length) - ivLen -= length - } - } - - tmp.fill(0) - return { key: key, iv: iv } -} - -module.exports = EVP_BytesToKey - -},{"safe-buffer":"Wugr","md5.js":"OP64"}],"zRzx":[function(require,module,exports) { - -var MODES = require('./modes') -var AuthCipher = require('./authCipher') -var Buffer = require('safe-buffer').Buffer -var StreamCipher = require('./streamCipher') -var Transform = require('cipher-base') -var aes = require('./aes') -var ebtk = require('evp_bytestokey') -var inherits = require('inherits') - -function Cipher (mode, key, iv) { - Transform.call(this) - - this._cache = new Splitter() - this._cipher = new aes.AES(key) - this._prev = Buffer.from(iv) - this._mode = mode - this._autopadding = true -} - -inherits(Cipher, Transform) - -Cipher.prototype._update = function (data) { - this._cache.add(data) - var chunk - var thing - var out = [] - - while ((chunk = this._cache.get())) { - thing = this._mode.encrypt(this, chunk) - out.push(thing) - } - - return Buffer.concat(out) -} - -var PADDING = Buffer.alloc(16, 0x10) - -Cipher.prototype._final = function () { - var chunk = this._cache.flush() - if (this._autopadding) { - chunk = this._mode.encrypt(this, chunk) - this._cipher.scrub() - return chunk - } - - if (!chunk.equals(PADDING)) { - this._cipher.scrub() - throw new Error('data not multiple of block length') - } -} - -Cipher.prototype.setAutoPadding = function (setTo) { - this._autopadding = !!setTo - return this -} - -function Splitter () { - this.cache = Buffer.allocUnsafe(0) -} - -Splitter.prototype.add = function (data) { - this.cache = Buffer.concat([this.cache, data]) -} - -Splitter.prototype.get = function () { - if (this.cache.length > 15) { - var out = this.cache.slice(0, 16) - this.cache = this.cache.slice(16) - return out - } - return null -} - -Splitter.prototype.flush = function () { - var len = 16 - this.cache.length - var padBuff = Buffer.allocUnsafe(len) - - var i = -1 - while (++i < len) { - padBuff.writeUInt8(len, i) - } - - return Buffer.concat([this.cache, padBuff]) -} - -function createCipheriv (suite, password, iv) { - var config = MODES[suite.toLowerCase()] - if (!config) throw new TypeError('invalid suite type') - - if (typeof password === 'string') password = Buffer.from(password) - if (password.length !== config.key / 8) throw new TypeError('invalid key length ' + password.length) - - if (typeof iv === 'string') iv = Buffer.from(iv) - if (config.mode !== 'GCM' && iv.length !== config.iv) throw new TypeError('invalid iv length ' + iv.length) - - if (config.type === 'stream') { - return new StreamCipher(config.module, password, iv) - } else if (config.type === 'auth') { - return new AuthCipher(config.module, password, iv) - } - - return new Cipher(config.module, password, iv) -} - -function createCipher (suite, password) { - var config = MODES[suite.toLowerCase()] - if (!config) throw new TypeError('invalid suite type') - - var keys = ebtk(password, false, config.key, config.iv) - return createCipheriv(suite, keys.key, keys.iv) -} - -exports.createCipheriv = createCipheriv -exports.createCipher = createCipher - -},{"./modes":"zdSg","./authCipher":"KDZf","safe-buffer":"Wugr","./streamCipher":"XmsB","cipher-base":"bjfr","./aes":"dNn4","evp_bytestokey":"exU6","inherits":"Bm0n"}],"qK8d":[function(require,module,exports) { - -var AuthCipher = require('./authCipher') -var Buffer = require('safe-buffer').Buffer -var MODES = require('./modes') -var StreamCipher = require('./streamCipher') -var Transform = require('cipher-base') -var aes = require('./aes') -var ebtk = require('evp_bytestokey') -var inherits = require('inherits') - -function Decipher (mode, key, iv) { - Transform.call(this) - - this._cache = new Splitter() - this._last = void 0 - this._cipher = new aes.AES(key) - this._prev = Buffer.from(iv) - this._mode = mode - this._autopadding = true -} - -inherits(Decipher, Transform) - -Decipher.prototype._update = function (data) { - this._cache.add(data) - var chunk - var thing - var out = [] - while ((chunk = this._cache.get(this._autopadding))) { - thing = this._mode.decrypt(this, chunk) - out.push(thing) - } - return Buffer.concat(out) -} - -Decipher.prototype._final = function () { - var chunk = this._cache.flush() - if (this._autopadding) { - return unpad(this._mode.decrypt(this, chunk)) - } else if (chunk) { - throw new Error('data not multiple of block length') - } -} - -Decipher.prototype.setAutoPadding = function (setTo) { - this._autopadding = !!setTo - return this -} - -function Splitter () { - this.cache = Buffer.allocUnsafe(0) -} - -Splitter.prototype.add = function (data) { - this.cache = Buffer.concat([this.cache, data]) -} - -Splitter.prototype.get = function (autoPadding) { - var out - if (autoPadding) { - if (this.cache.length > 16) { - out = this.cache.slice(0, 16) - this.cache = this.cache.slice(16) - return out - } - } else { - if (this.cache.length >= 16) { - out = this.cache.slice(0, 16) - this.cache = this.cache.slice(16) - return out - } - } - - return null -} - -Splitter.prototype.flush = function () { - if (this.cache.length) return this.cache -} - -function unpad (last) { - var padded = last[15] - if (padded < 1 || padded > 16) { - throw new Error('unable to decrypt data') - } - var i = -1 - while (++i < padded) { - if (last[(i + (16 - padded))] !== padded) { - throw new Error('unable to decrypt data') - } - } - if (padded === 16) return - - return last.slice(0, 16 - padded) -} - -function createDecipheriv (suite, password, iv) { - var config = MODES[suite.toLowerCase()] - if (!config) throw new TypeError('invalid suite type') - - if (typeof iv === 'string') iv = Buffer.from(iv) - if (config.mode !== 'GCM' && iv.length !== config.iv) throw new TypeError('invalid iv length ' + iv.length) - - if (typeof password === 'string') password = Buffer.from(password) - if (password.length !== config.key / 8) throw new TypeError('invalid key length ' + password.length) - - if (config.type === 'stream') { - return new StreamCipher(config.module, password, iv, true) - } else if (config.type === 'auth') { - return new AuthCipher(config.module, password, iv, true) - } - - return new Decipher(config.module, password, iv) -} - -function createDecipher (suite, password) { - var config = MODES[suite.toLowerCase()] - if (!config) throw new TypeError('invalid suite type') - - var keys = ebtk(password, false, config.key, config.iv) - return createDecipheriv(suite, keys.key, keys.iv) -} - -exports.createDecipher = createDecipher -exports.createDecipheriv = createDecipheriv - -},{"./authCipher":"KDZf","safe-buffer":"Wugr","./modes":"zdSg","./streamCipher":"XmsB","cipher-base":"bjfr","./aes":"dNn4","evp_bytestokey":"exU6","inherits":"Bm0n"}],"hisC":[function(require,module,exports) { -var ciphers = require('./encrypter') -var deciphers = require('./decrypter') -var modes = require('./modes/list.json') - -function getCiphers () { - return Object.keys(modes) -} - -exports.createCipher = exports.Cipher = ciphers.createCipher -exports.createCipheriv = exports.Cipheriv = ciphers.createCipheriv -exports.createDecipher = exports.Decipher = deciphers.createDecipher -exports.createDecipheriv = exports.Decipheriv = deciphers.createDecipheriv -exports.listCiphers = exports.getCiphers = getCiphers - -},{"./encrypter":"zRzx","./decrypter":"qK8d","./modes/list.json":"veqz"}],"V0IC":[function(require,module,exports) { -exports['des-ecb'] = { - key: 8, - iv: 0 -} -exports['des-cbc'] = exports.des = { - key: 8, - iv: 8 -} -exports['des-ede3-cbc'] = exports.des3 = { - key: 24, - iv: 8 -} -exports['des-ede3'] = { - key: 24, - iv: 0 -} -exports['des-ede-cbc'] = { - key: 16, - iv: 8 -} -exports['des-ede'] = { - key: 16, - iv: 0 -} - -},{}],"KTbn":[function(require,module,exports) { -var DES = require('browserify-des') -var aes = require('browserify-aes/browser') -var aesModes = require('browserify-aes/modes') -var desModes = require('browserify-des/modes') -var ebtk = require('evp_bytestokey') - -function createCipher (suite, password) { - suite = suite.toLowerCase() - - var keyLen, ivLen - if (aesModes[suite]) { - keyLen = aesModes[suite].key - ivLen = aesModes[suite].iv - } else if (desModes[suite]) { - keyLen = desModes[suite].key * 8 - ivLen = desModes[suite].iv - } else { - throw new TypeError('invalid suite type') - } - - var keys = ebtk(password, false, keyLen, ivLen) - return createCipheriv(suite, keys.key, keys.iv) -} - -function createDecipher (suite, password) { - suite = suite.toLowerCase() - - var keyLen, ivLen - if (aesModes[suite]) { - keyLen = aesModes[suite].key - ivLen = aesModes[suite].iv - } else if (desModes[suite]) { - keyLen = desModes[suite].key * 8 - ivLen = desModes[suite].iv - } else { - throw new TypeError('invalid suite type') - } - - var keys = ebtk(password, false, keyLen, ivLen) - return createDecipheriv(suite, keys.key, keys.iv) -} - -function createCipheriv (suite, key, iv) { - suite = suite.toLowerCase() - if (aesModes[suite]) return aes.createCipheriv(suite, key, iv) - if (desModes[suite]) return new DES({ key: key, iv: iv, mode: suite }) - - throw new TypeError('invalid suite type') -} - -function createDecipheriv (suite, key, iv) { - suite = suite.toLowerCase() - if (aesModes[suite]) return aes.createDecipheriv(suite, key, iv) - if (desModes[suite]) return new DES({ key: key, iv: iv, mode: suite, decrypt: true }) - - throw new TypeError('invalid suite type') -} - -function getCiphers () { - return Object.keys(desModes).concat(aes.getCiphers()) -} - -exports.createCipher = exports.Cipher = createCipher -exports.createCipheriv = exports.Cipheriv = createCipheriv -exports.createDecipher = exports.Decipher = createDecipher -exports.createDecipheriv = exports.Decipheriv = createDecipheriv -exports.listCiphers = exports.getCiphers = getCiphers - -},{"browserify-des":"sKVA","browserify-aes/browser":"hisC","browserify-aes/modes":"zdSg","browserify-des/modes":"V0IC","evp_bytestokey":"exU6"}],"VQun":[function(require,module,exports) { -var bn = require('bn.js'); -var brorand = require('brorand'); - -function MillerRabin(rand) { - this.rand = rand || new brorand.Rand(); -} -module.exports = MillerRabin; - -MillerRabin.create = function create(rand) { - return new MillerRabin(rand); -}; - -MillerRabin.prototype._randbelow = function _randbelow(n) { - var len = n.bitLength(); - var min_bytes = Math.ceil(len / 8); - - // Generage random bytes until a number less than n is found. - // This ensures that 0..n-1 have an equal probability of being selected. - do - var a = new bn(this.rand.generate(min_bytes)); - while (a.cmp(n) >= 0); - - return a; -}; - -MillerRabin.prototype._randrange = function _randrange(start, stop) { - // Generate a random number greater than or equal to start and less than stop. - var size = stop.sub(start); - return start.add(this._randbelow(size)); -}; - -MillerRabin.prototype.test = function test(n, k, cb) { - var len = n.bitLength(); - var red = bn.mont(n); - var rone = new bn(1).toRed(red); - - if (!k) - k = Math.max(1, (len / 48) | 0); - - // Find d and s, (n - 1) = (2 ^ s) * d; - var n1 = n.subn(1); - for (var s = 0; !n1.testn(s); s++) {} - var d = n.shrn(s); - - var rn1 = n1.toRed(red); - - var prime = true; - for (; k > 0; k--) { - var a = this._randrange(new bn(2), n1); - if (cb) - cb(a); - - var x = a.toRed(red).redPow(d); - if (x.cmp(rone) === 0 || x.cmp(rn1) === 0) - continue; - - for (var i = 1; i < s; i++) { - x = x.redSqr(); - - if (x.cmp(rone) === 0) - return false; - if (x.cmp(rn1) === 0) - break; - } - - if (i === s) - return false; - } - - return prime; -}; - -MillerRabin.prototype.getDivisor = function getDivisor(n, k) { - var len = n.bitLength(); - var red = bn.mont(n); - var rone = new bn(1).toRed(red); - - if (!k) - k = Math.max(1, (len / 48) | 0); - - // Find d and s, (n - 1) = (2 ^ s) * d; - var n1 = n.subn(1); - for (var s = 0; !n1.testn(s); s++) {} - var d = n.shrn(s); - - var rn1 = n1.toRed(red); - - for (; k > 0; k--) { - var a = this._randrange(new bn(2), n1); - - var g = n.gcd(a); - if (g.cmpn(1) !== 0) - return g; - - var x = a.toRed(red).redPow(d); - if (x.cmp(rone) === 0 || x.cmp(rn1) === 0) - continue; - - for (var i = 1; i < s; i++) { - x = x.redSqr(); - - if (x.cmp(rone) === 0) - return x.fromRed().subn(1).gcd(n); - if (x.cmp(rn1) === 0) - break; - } - - if (i === s) { - x = x.redSqr(); - return x.fromRed().subn(1).gcd(n); - } - } - - return false; -}; - -},{"bn.js":"BOxy","brorand":"e03B"}],"Lj8n":[function(require,module,exports) { -var randomBytes = require('randombytes'); -module.exports = findPrime; -findPrime.simpleSieve = simpleSieve; -findPrime.fermatTest = fermatTest; -var BN = require('bn.js'); -var TWENTYFOUR = new BN(24); -var MillerRabin = require('miller-rabin'); -var millerRabin = new MillerRabin(); -var ONE = new BN(1); -var TWO = new BN(2); -var FIVE = new BN(5); -var SIXTEEN = new BN(16); -var EIGHT = new BN(8); -var TEN = new BN(10); -var THREE = new BN(3); -var SEVEN = new BN(7); -var ELEVEN = new BN(11); -var FOUR = new BN(4); -var TWELVE = new BN(12); -var primes = null; - -function _getPrimes() { - if (primes !== null) - return primes; - - var limit = 0x100000; - var res = []; - res[0] = 2; - for (var i = 1, k = 3; k < limit; k += 2) { - var sqrt = Math.ceil(Math.sqrt(k)); - for (var j = 0; j < i && res[j] <= sqrt; j++) - if (k % res[j] === 0) - break; - - if (i !== j && res[j] <= sqrt) - continue; - - res[i++] = k; - } - primes = res; - return res; -} - -function simpleSieve(p) { - var primes = _getPrimes(); - - for (var i = 0; i < primes.length; i++) - if (p.modn(primes[i]) === 0) { - if (p.cmpn(primes[i]) === 0) { - return true; - } else { - return false; - } - } - - return true; -} - -function fermatTest(p) { - var red = BN.mont(p); - return TWO.toRed(red).redPow(p.subn(1)).fromRed().cmpn(1) === 0; -} - -function findPrime(bits, gen) { - if (bits < 16) { - // this is what openssl does - if (gen === 2 || gen === 5) { - return new BN([0x8c, 0x7b]); - } else { - return new BN([0x8c, 0x27]); - } - } - gen = new BN(gen); - - var num, n2; - - while (true) { - num = new BN(randomBytes(Math.ceil(bits / 8))); - while (num.bitLength() > bits) { - num.ishrn(1); - } - if (num.isEven()) { - num.iadd(ONE); - } - if (!num.testn(1)) { - num.iadd(TWO); - } - if (!gen.cmp(TWO)) { - while (num.mod(TWENTYFOUR).cmp(ELEVEN)) { - num.iadd(FOUR); - } - } else if (!gen.cmp(FIVE)) { - while (num.mod(TEN).cmp(THREE)) { - num.iadd(FOUR); - } - } - n2 = num.shrn(1); - if (simpleSieve(n2) && simpleSieve(num) && - fermatTest(n2) && fermatTest(num) && - millerRabin.test(n2) && millerRabin.test(num)) { - return num; - } - } - -} - -},{"randombytes":"XJNj","bn.js":"BOxy","miller-rabin":"VQun"}],"nq14":[function(require,module,exports) { -module.exports = { - "modp1": { - "gen": "02", - "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a63a3620ffffffffffffffff" - }, - "modp2": { - "gen": "02", - "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece65381ffffffffffffffff" - }, - "modp5": { - "gen": "02", - "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca237327ffffffffffffffff" - }, - "modp14": { - "gen": "02", - "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff" - }, - "modp15": { - "gen": "02", - "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a93ad2caffffffffffffffff" - }, - "modp16": { - "gen": "02", - "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c934063199ffffffffffffffff" - }, - "modp17": { - "gen": "02", - "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dcc4024ffffffffffffffff" - }, - "modp18": { - "gen": "02", - "prime": "ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aaac42dad33170d04507a33a85521abdf1cba64ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6bf12ffa06d98a0864d87602733ec86a64521f2b18177b200cbbe117577a615d6c770988c0bad946e208e24fa074e5ab3143db5bfce0fd108e4b82d120a92108011a723c12a787e6d788719a10bdba5b2699c327186af4e23c1a946834b6150bda2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed1f612970cee2d7afb81bdd762170481cd0069127d5b05aa993b4ea988d8fddc186ffb7dc90a6c08f4df435c93402849236c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bdf8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1bdb7f1447e6cc254b332051512bd7af426fb8f401378cd2bf5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6d55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f323a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aacc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be32806a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55cda56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee12bf2d5b0b7474d6e694f91e6dbe115974a3926f12fee5e438777cb6a932df8cd8bec4d073b931ba3bc832b68d9dd300741fa7bf8afc47ed2576f6936ba424663aab639c5ae4f5683423b4742bf1c978238f16cbe39d652de3fdb8befc848ad922222e04a4037c0713eb57a81a23f0c73473fc646cea306b4bcbc8862f8385ddfa9d4b7fa2c087e879683303ed5bdd3a062b3cf5b3a278a66d2a13f83f44f82ddf310ee074ab6a364597e899a0255dc164f31cc50846851df9ab48195ded7ea1b1d510bd7ee74d73faf36bc31ecfa268359046f4eb879f924009438b481c6cd7889a002ed5ee382bc9190da6fc026e479558e4475677e9aa9e3050e2765694dfc81f56e880b96e7160c980dd98edd3dfffffffffffffffff" - } -}; -},{}],"SXPn":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -var BN = require('bn.js'); -var MillerRabin = require('miller-rabin'); -var millerRabin = new MillerRabin(); -var TWENTYFOUR = new BN(24); -var ELEVEN = new BN(11); -var TEN = new BN(10); -var THREE = new BN(3); -var SEVEN = new BN(7); -var primes = require('./generatePrime'); -var randomBytes = require('randombytes'); -module.exports = DH; - -function setPublicKey(pub, enc) { - enc = enc || 'utf8'; - if (!Buffer.isBuffer(pub)) { - pub = new Buffer(pub, enc); - } - this._pub = new BN(pub); - return this; -} - -function setPrivateKey(priv, enc) { - enc = enc || 'utf8'; - if (!Buffer.isBuffer(priv)) { - priv = new Buffer(priv, enc); - } - this._priv = new BN(priv); - return this; -} - -var primeCache = {}; -function checkPrime(prime, generator) { - var gen = generator.toString('hex'); - var hex = [gen, prime.toString(16)].join('_'); - if (hex in primeCache) { - return primeCache[hex]; - } - var error = 0; - - if (prime.isEven() || - !primes.simpleSieve || - !primes.fermatTest(prime) || - !millerRabin.test(prime)) { - //not a prime so +1 - error += 1; - - if (gen === '02' || gen === '05') { - // we'd be able to check the generator - // it would fail so +8 - error += 8; - } else { - //we wouldn't be able to test the generator - // so +4 - error += 4; - } - primeCache[hex] = error; - return error; - } - if (!millerRabin.test(prime.shrn(1))) { - //not a safe prime - error += 2; - } - var rem; - switch (gen) { - case '02': - if (prime.mod(TWENTYFOUR).cmp(ELEVEN)) { - // unsuidable generator - error += 8; - } - break; - case '05': - rem = prime.mod(TEN); - if (rem.cmp(THREE) && rem.cmp(SEVEN)) { - // prime mod 10 needs to equal 3 or 7 - error += 8; - } - break; - default: - error += 4; - } - primeCache[hex] = error; - return error; -} - -function DH(prime, generator, malleable) { - this.setGenerator(generator); - this.__prime = new BN(prime); - this._prime = BN.mont(this.__prime); - this._primeLen = prime.length; - this._pub = undefined; - this._priv = undefined; - this._primeCode = undefined; - if (malleable) { - this.setPublicKey = setPublicKey; - this.setPrivateKey = setPrivateKey; - } else { - this._primeCode = 8; - } -} -Object.defineProperty(DH.prototype, 'verifyError', { - enumerable: true, - get: function () { - if (typeof this._primeCode !== 'number') { - this._primeCode = checkPrime(this.__prime, this.__gen); - } - return this._primeCode; - } -}); -DH.prototype.generateKeys = function () { - if (!this._priv) { - this._priv = new BN(randomBytes(this._primeLen)); - } - this._pub = this._gen.toRed(this._prime).redPow(this._priv).fromRed(); - return this.getPublicKey(); -}; - -DH.prototype.computeSecret = function (other) { - other = new BN(other); - other = other.toRed(this._prime); - var secret = other.redPow(this._priv).fromRed(); - var out = new Buffer(secret.toArray()); - var prime = this.getPrime(); - if (out.length < prime.length) { - var front = new Buffer(prime.length - out.length); - front.fill(0); - out = Buffer.concat([front, out]); - } - return out; -}; - -DH.prototype.getPublicKey = function getPublicKey(enc) { - return formatReturnValue(this._pub, enc); -}; - -DH.prototype.getPrivateKey = function getPrivateKey(enc) { - return formatReturnValue(this._priv, enc); -}; - -DH.prototype.getPrime = function (enc) { - return formatReturnValue(this.__prime, enc); -}; - -DH.prototype.getGenerator = function (enc) { - return formatReturnValue(this._gen, enc); -}; - -DH.prototype.setGenerator = function (gen, enc) { - enc = enc || 'utf8'; - if (!Buffer.isBuffer(gen)) { - gen = new Buffer(gen, enc); - } - this.__gen = gen; - this._gen = new BN(gen); - return this; -}; - -function formatReturnValue(bn, enc) { - var buf = new Buffer(bn.toArray()); - if (!enc) { - return buf; - } else { - return buf.toString(enc); - } -} - -},{"bn.js":"BOxy","miller-rabin":"VQun","./generatePrime":"Lj8n","randombytes":"XJNj","buffer":"dskh"}],"WFL2":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -var generatePrime = require('./lib/generatePrime') -var primes = require('./lib/primes.json') - -var DH = require('./lib/dh') - -function getDiffieHellman (mod) { - var prime = new Buffer(primes[mod].prime, 'hex') - var gen = new Buffer(primes[mod].gen, 'hex') - - return new DH(prime, gen) -} - -var ENCODINGS = { - 'binary': true, 'hex': true, 'base64': true -} - -function createDiffieHellman (prime, enc, generator, genc) { - if (Buffer.isBuffer(enc) || ENCODINGS[enc] === undefined) { - return createDiffieHellman(prime, 'binary', enc, generator) - } - - enc = enc || 'binary' - genc = genc || 'binary' - generator = generator || new Buffer([2]) - - if (!Buffer.isBuffer(generator)) { - generator = new Buffer(generator, genc) - } - - if (typeof prime === 'number') { - return new DH(generatePrime(prime, generator), generator, true) - } - - if (!Buffer.isBuffer(prime)) { - prime = new Buffer(prime, enc) - } - - return new DH(prime, generator, true) -} - -exports.DiffieHellmanGroup = exports.createDiffieHellmanGroup = exports.getDiffieHellman = getDiffieHellman -exports.createDiffieHellman = exports.DiffieHellman = createDiffieHellman - -},{"./lib/generatePrime":"Lj8n","./lib/primes.json":"nq14","./lib/dh":"SXPn","buffer":"dskh"}],"Aukv":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -var bn = require('bn.js'); -var randomBytes = require('randombytes'); -module.exports = crt; -function blind(priv) { - var r = getr(priv); - var blinder = r.toRed(bn.mont(priv.modulus)) - .redPow(new bn(priv.publicExponent)).fromRed(); - return { - blinder: blinder, - unblinder:r.invm(priv.modulus) - }; -} -function crt(msg, priv) { - var blinds = blind(priv); - var len = priv.modulus.byteLength(); - var mod = bn.mont(priv.modulus); - var blinded = new bn(msg).mul(blinds.blinder).umod(priv.modulus); - var c1 = blinded.toRed(bn.mont(priv.prime1)); - var c2 = blinded.toRed(bn.mont(priv.prime2)); - var qinv = priv.coefficient; - var p = priv.prime1; - var q = priv.prime2; - var m1 = c1.redPow(priv.exponent1); - var m2 = c2.redPow(priv.exponent2); - m1 = m1.fromRed(); - m2 = m2.fromRed(); - var h = m1.isub(m2).imul(qinv).umod(p); - h.imul(q); - m2.iadd(h); - return new Buffer(m2.imul(blinds.unblinder).umod(priv.modulus).toArray(false, len)); -} -crt.getr = getr; -function getr(priv) { - var len = priv.modulus.byteLength(); - var r = new bn(randomBytes(len)); - while (r.cmp(priv.modulus) >= 0 || !r.umod(priv.prime1) || !r.umod(priv.prime2)) { - r = new bn(randomBytes(len)); - } - return r; -} - -},{"bn.js":"BOxy","randombytes":"XJNj","buffer":"dskh"}],"qy9T":[function(require,module,exports) { -var indexOf = function (xs, item) { - if (xs.indexOf) return xs.indexOf(item); - else for (var i = 0; i < xs.length; i++) { - if (xs[i] === item) return i; - } - return -1; -}; -var Object_keys = function (obj) { - if (Object.keys) return Object.keys(obj) - else { - var res = []; - for (var key in obj) res.push(key) - return res; - } -}; - -var forEach = function (xs, fn) { - if (xs.forEach) return xs.forEach(fn) - else for (var i = 0; i < xs.length; i++) { - fn(xs[i], i, xs); - } -}; - -var defineProp = (function() { - try { - Object.defineProperty({}, '_', {}); - return function(obj, name, value) { - Object.defineProperty(obj, name, { - writable: true, - enumerable: false, - configurable: true, - value: value - }) - }; - } catch(e) { - return function(obj, name, value) { - obj[name] = value; - }; - } -}()); - -var globals = ['Array', 'Boolean', 'Date', 'Error', 'EvalError', 'Function', -'Infinity', 'JSON', 'Math', 'NaN', 'Number', 'Object', 'RangeError', -'ReferenceError', 'RegExp', 'String', 'SyntaxError', 'TypeError', 'URIError', -'decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', -'eval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'undefined', 'unescape']; - -function Context() {} -Context.prototype = {}; - -var Script = exports.Script = function NodeScript (code) { - if (!(this instanceof Script)) return new Script(code); - this.code = code; -}; - -Script.prototype.runInContext = function (context) { - if (!(context instanceof Context)) { - throw new TypeError("needs a 'context' argument."); - } - - var iframe = document.createElement('iframe'); - if (!iframe.style) iframe.style = {}; - iframe.style.display = 'none'; - - document.body.appendChild(iframe); - - var win = iframe.contentWindow; - var wEval = win.eval, wExecScript = win.execScript; - - if (!wEval && wExecScript) { - // win.eval() magically appears when this is called in IE: - wExecScript.call(win, 'null'); - wEval = win.eval; - } - - forEach(Object_keys(context), function (key) { - win[key] = context[key]; - }); - forEach(globals, function (key) { - if (context[key]) { - win[key] = context[key]; - } - }); - - var winKeys = Object_keys(win); - - var res = wEval.call(win, this.code); - - forEach(Object_keys(win), function (key) { - // Avoid copying circular objects like `top` and `window` by only - // updating existing context properties or new properties in the `win` - // that was only introduced after the eval. - if (key in context || indexOf(winKeys, key) === -1) { - context[key] = win[key]; - } - }); - - forEach(globals, function (key) { - if (!(key in context)) { - defineProp(context, key, win[key]); - } - }); - - document.body.removeChild(iframe); - - return res; -}; - -Script.prototype.runInThisContext = function () { - return eval(this.code); // maybe... -}; - -Script.prototype.runInNewContext = function (context) { - var ctx = Script.createContext(context); - var res = this.runInContext(ctx); - - if (context) { - forEach(Object_keys(ctx), function (key) { - context[key] = ctx[key]; - }); - } - - return res; -}; - -forEach(Object_keys(Script.prototype), function (name) { - exports[name] = Script[name] = function (code) { - var s = Script(code); - return s[name].apply(s, [].slice.call(arguments, 1)); - }; -}); - -exports.isContext = function (context) { - return context instanceof Context; -}; - -exports.createScript = function (code) { - return exports.Script(code); -}; - -exports.createContext = Script.createContext = function (context) { - var copy = new Context(); - if(typeof context === 'object') { - forEach(Object_keys(context), function (key) { - copy[key] = context[key]; - }); - } - return copy; -}; - -},{}],"mvP6":[function(require,module,exports) { -var asn1 = require('../asn1'); -var inherits = require('inherits'); - -var api = exports; - -api.define = function define(name, body) { - return new Entity(name, body); -}; - -function Entity(name, body) { - this.name = name; - this.body = body; - - this.decoders = {}; - this.encoders = {}; -}; - -Entity.prototype._createNamed = function createNamed(base) { - var named; - try { - named = require('vm').runInThisContext( - '(function ' + this.name + '(entity) {\n' + - ' this._initNamed(entity);\n' + - '})' - ); - } catch (e) { - named = function (entity) { - this._initNamed(entity); - }; - } - inherits(named, base); - named.prototype._initNamed = function initnamed(entity) { - base.call(this, entity); - }; - - return new named(this); -}; - -Entity.prototype._getDecoder = function _getDecoder(enc) { - enc = enc || 'der'; - // Lazily create decoder - if (!this.decoders.hasOwnProperty(enc)) - this.decoders[enc] = this._createNamed(asn1.decoders[enc]); - return this.decoders[enc]; -}; - -Entity.prototype.decode = function decode(data, enc, options) { - return this._getDecoder(enc).decode(data, options); -}; - -Entity.prototype._getEncoder = function _getEncoder(enc) { - enc = enc || 'der'; - // Lazily create encoder - if (!this.encoders.hasOwnProperty(enc)) - this.encoders[enc] = this._createNamed(asn1.encoders[enc]); - return this.encoders[enc]; -}; - -Entity.prototype.encode = function encode(data, enc, /* internal */ reporter) { - return this._getEncoder(enc).encode(data, reporter); -}; - -},{"../asn1":"ZCez","inherits":"Bm0n","vm":"qy9T"}],"YMUn":[function(require,module,exports) { -var inherits = require('inherits'); - -function Reporter(options) { - this._reporterState = { - obj: null, - path: [], - options: options || {}, - errors: [] - }; -} -exports.Reporter = Reporter; - -Reporter.prototype.isError = function isError(obj) { - return obj instanceof ReporterError; -}; - -Reporter.prototype.save = function save() { - var state = this._reporterState; - - return { obj: state.obj, pathLen: state.path.length }; -}; - -Reporter.prototype.restore = function restore(data) { - var state = this._reporterState; - - state.obj = data.obj; - state.path = state.path.slice(0, data.pathLen); -}; - -Reporter.prototype.enterKey = function enterKey(key) { - return this._reporterState.path.push(key); -}; - -Reporter.prototype.exitKey = function exitKey(index) { - var state = this._reporterState; - - state.path = state.path.slice(0, index - 1); -}; - -Reporter.prototype.leaveKey = function leaveKey(index, key, value) { - var state = this._reporterState; - - this.exitKey(index); - if (state.obj !== null) - state.obj[key] = value; -}; - -Reporter.prototype.path = function path() { - return this._reporterState.path.join('/'); -}; - -Reporter.prototype.enterObject = function enterObject() { - var state = this._reporterState; - - var prev = state.obj; - state.obj = {}; - return prev; -}; - -Reporter.prototype.leaveObject = function leaveObject(prev) { - var state = this._reporterState; - - var now = state.obj; - state.obj = prev; - return now; -}; - -Reporter.prototype.error = function error(msg) { - var err; - var state = this._reporterState; - - var inherited = msg instanceof ReporterError; - if (inherited) { - err = msg; - } else { - err = new ReporterError(state.path.map(function(elem) { - return '[' + JSON.stringify(elem) + ']'; - }).join(''), msg.message || msg, msg.stack); - } - - if (!state.options.partial) - throw err; - - if (!inherited) - state.errors.push(err); - - return err; -}; - -Reporter.prototype.wrapResult = function wrapResult(result) { - var state = this._reporterState; - if (!state.options.partial) - return result; - - return { - result: this.isError(result) ? null : result, - errors: state.errors - }; -}; - -function ReporterError(path, msg) { - this.path = path; - this.rethrow(msg); -}; -inherits(ReporterError, Error); - -ReporterError.prototype.rethrow = function rethrow(msg) { - this.message = msg + ' at: ' + (this.path || '(shallow)'); - if (Error.captureStackTrace) - Error.captureStackTrace(this, ReporterError); - - if (!this.stack) { - try { - // IE only adds stack when thrown - throw new Error(this.message); - } catch (e) { - this.stack = e.stack; - } - } - return this; -}; - -},{"inherits":"Bm0n"}],"K43q":[function(require,module,exports) { - -var inherits = require('inherits'); -var Reporter = require('../base').Reporter; -var Buffer = require('buffer').Buffer; - -function DecoderBuffer(base, options) { - Reporter.call(this, options); - if (!Buffer.isBuffer(base)) { - this.error('Input not Buffer'); - return; - } - - this.base = base; - this.offset = 0; - this.length = base.length; -} -inherits(DecoderBuffer, Reporter); -exports.DecoderBuffer = DecoderBuffer; - -DecoderBuffer.prototype.save = function save() { - return { offset: this.offset, reporter: Reporter.prototype.save.call(this) }; -}; - -DecoderBuffer.prototype.restore = function restore(save) { - // Return skipped data - var res = new DecoderBuffer(this.base); - res.offset = save.offset; - res.length = this.offset; - - this.offset = save.offset; - Reporter.prototype.restore.call(this, save.reporter); - - return res; -}; - -DecoderBuffer.prototype.isEmpty = function isEmpty() { - return this.offset === this.length; -}; - -DecoderBuffer.prototype.readUInt8 = function readUInt8(fail) { - if (this.offset + 1 <= this.length) - return this.base.readUInt8(this.offset++, true); - else - return this.error(fail || 'DecoderBuffer overrun'); -} - -DecoderBuffer.prototype.skip = function skip(bytes, fail) { - if (!(this.offset + bytes <= this.length)) - return this.error(fail || 'DecoderBuffer overrun'); - - var res = new DecoderBuffer(this.base); - - // Share reporter state - res._reporterState = this._reporterState; - - res.offset = this.offset; - res.length = this.offset + bytes; - this.offset += bytes; - return res; -} - -DecoderBuffer.prototype.raw = function raw(save) { - return this.base.slice(save ? save.offset : this.offset, this.length); -} - -function EncoderBuffer(value, reporter) { - if (Array.isArray(value)) { - this.length = 0; - this.value = value.map(function(item) { - if (!(item instanceof EncoderBuffer)) - item = new EncoderBuffer(item, reporter); - this.length += item.length; - return item; - }, this); - } else if (typeof value === 'number') { - if (!(0 <= value && value <= 0xff)) - return reporter.error('non-byte EncoderBuffer value'); - this.value = value; - this.length = 1; - } else if (typeof value === 'string') { - this.value = value; - this.length = Buffer.byteLength(value); - } else if (Buffer.isBuffer(value)) { - this.value = value; - this.length = value.length; - } else { - return reporter.error('Unsupported type: ' + typeof value); - } -} -exports.EncoderBuffer = EncoderBuffer; - -EncoderBuffer.prototype.join = function join(out, offset) { - if (!out) - out = new Buffer(this.length); - if (!offset) - offset = 0; - - if (this.length === 0) - return out; - - if (Array.isArray(this.value)) { - this.value.forEach(function(item) { - item.join(out, offset); - offset += item.length; - }); - } else { - if (typeof this.value === 'number') - out[offset] = this.value; - else if (typeof this.value === 'string') - out.write(this.value, offset); - else if (Buffer.isBuffer(this.value)) - this.value.copy(out, offset); - offset += this.length; - } - - return out; -}; - -},{"inherits":"Bm0n","../base":"L0i5","buffer":"dskh"}],"trF9":[function(require,module,exports) { -var Reporter = require('../base').Reporter; -var EncoderBuffer = require('../base').EncoderBuffer; -var DecoderBuffer = require('../base').DecoderBuffer; -var assert = require('minimalistic-assert'); - -// Supported tags -var tags = [ - 'seq', 'seqof', 'set', 'setof', 'objid', 'bool', - 'gentime', 'utctime', 'null_', 'enum', 'int', 'objDesc', - 'bitstr', 'bmpstr', 'charstr', 'genstr', 'graphstr', 'ia5str', 'iso646str', - 'numstr', 'octstr', 'printstr', 't61str', 'unistr', 'utf8str', 'videostr' -]; - -// Public methods list -var methods = [ - 'key', 'obj', 'use', 'optional', 'explicit', 'implicit', 'def', 'choice', - 'any', 'contains' -].concat(tags); - -// Overrided methods list -var overrided = [ - '_peekTag', '_decodeTag', '_use', - '_decodeStr', '_decodeObjid', '_decodeTime', - '_decodeNull', '_decodeInt', '_decodeBool', '_decodeList', - - '_encodeComposite', '_encodeStr', '_encodeObjid', '_encodeTime', - '_encodeNull', '_encodeInt', '_encodeBool' -]; - -function Node(enc, parent) { - var state = {}; - this._baseState = state; - - state.enc = enc; - - state.parent = parent || null; - state.children = null; - - // State - state.tag = null; - state.args = null; - state.reverseArgs = null; - state.choice = null; - state.optional = false; - state.any = false; - state.obj = false; - state.use = null; - state.useDecoder = null; - state.key = null; - state['default'] = null; - state.explicit = null; - state.implicit = null; - state.contains = null; - - // Should create new instance on each method - if (!state.parent) { - state.children = []; - this._wrap(); - } -} -module.exports = Node; - -var stateProps = [ - 'enc', 'parent', 'children', 'tag', 'args', 'reverseArgs', 'choice', - 'optional', 'any', 'obj', 'use', 'alteredUse', 'key', 'default', 'explicit', - 'implicit', 'contains' -]; - -Node.prototype.clone = function clone() { - var state = this._baseState; - var cstate = {}; - stateProps.forEach(function(prop) { - cstate[prop] = state[prop]; - }); - var res = new this.constructor(cstate.parent); - res._baseState = cstate; - return res; -}; - -Node.prototype._wrap = function wrap() { - var state = this._baseState; - methods.forEach(function(method) { - this[method] = function _wrappedMethod() { - var clone = new this.constructor(this); - state.children.push(clone); - return clone[method].apply(clone, arguments); - }; - }, this); -}; - -Node.prototype._init = function init(body) { - var state = this._baseState; - - assert(state.parent === null); - body.call(this); - - // Filter children - state.children = state.children.filter(function(child) { - return child._baseState.parent === this; - }, this); - assert.equal(state.children.length, 1, 'Root node can have only one child'); -}; - -Node.prototype._useArgs = function useArgs(args) { - var state = this._baseState; - - // Filter children and args - var children = args.filter(function(arg) { - return arg instanceof this.constructor; - }, this); - args = args.filter(function(arg) { - return !(arg instanceof this.constructor); - }, this); - - if (children.length !== 0) { - assert(state.children === null); - state.children = children; - - // Replace parent to maintain backward link - children.forEach(function(child) { - child._baseState.parent = this; - }, this); - } - if (args.length !== 0) { - assert(state.args === null); - state.args = args; - state.reverseArgs = args.map(function(arg) { - if (typeof arg !== 'object' || arg.constructor !== Object) - return arg; - - var res = {}; - Object.keys(arg).forEach(function(key) { - if (key == (key | 0)) - key |= 0; - var value = arg[key]; - res[value] = key; - }); - return res; - }); - } -}; - -// -// Overrided methods -// - -overrided.forEach(function(method) { - Node.prototype[method] = function _overrided() { - var state = this._baseState; - throw new Error(method + ' not implemented for encoding: ' + state.enc); - }; -}); - -// -// Public methods -// - -tags.forEach(function(tag) { - Node.prototype[tag] = function _tagMethod() { - var state = this._baseState; - var args = Array.prototype.slice.call(arguments); - - assert(state.tag === null); - state.tag = tag; - - this._useArgs(args); - - return this; - }; -}); - -Node.prototype.use = function use(item) { - assert(item); - var state = this._baseState; - - assert(state.use === null); - state.use = item; - - return this; -}; - -Node.prototype.optional = function optional() { - var state = this._baseState; - - state.optional = true; - - return this; -}; - -Node.prototype.def = function def(val) { - var state = this._baseState; - - assert(state['default'] === null); - state['default'] = val; - state.optional = true; - - return this; -}; - -Node.prototype.explicit = function explicit(num) { - var state = this._baseState; - - assert(state.explicit === null && state.implicit === null); - state.explicit = num; - - return this; -}; - -Node.prototype.implicit = function implicit(num) { - var state = this._baseState; - - assert(state.explicit === null && state.implicit === null); - state.implicit = num; - - return this; -}; - -Node.prototype.obj = function obj() { - var state = this._baseState; - var args = Array.prototype.slice.call(arguments); - - state.obj = true; - - if (args.length !== 0) - this._useArgs(args); - - return this; -}; - -Node.prototype.key = function key(newKey) { - var state = this._baseState; - - assert(state.key === null); - state.key = newKey; - - return this; -}; - -Node.prototype.any = function any() { - var state = this._baseState; - - state.any = true; - - return this; -}; - -Node.prototype.choice = function choice(obj) { - var state = this._baseState; - - assert(state.choice === null); - state.choice = obj; - this._useArgs(Object.keys(obj).map(function(key) { - return obj[key]; - })); - - return this; -}; - -Node.prototype.contains = function contains(item) { - var state = this._baseState; - - assert(state.use === null); - state.contains = item; - - return this; -}; - -// -// Decoding -// - -Node.prototype._decode = function decode(input, options) { - var state = this._baseState; - - // Decode root node - if (state.parent === null) - return input.wrapResult(state.children[0]._decode(input, options)); - - var result = state['default']; - var present = true; - - var prevKey = null; - if (state.key !== null) - prevKey = input.enterKey(state.key); - - // Check if tag is there - if (state.optional) { - var tag = null; - if (state.explicit !== null) - tag = state.explicit; - else if (state.implicit !== null) - tag = state.implicit; - else if (state.tag !== null) - tag = state.tag; - - if (tag === null && !state.any) { - // Trial and Error - var save = input.save(); - try { - if (state.choice === null) - this._decodeGeneric(state.tag, input, options); - else - this._decodeChoice(input, options); - present = true; - } catch (e) { - present = false; - } - input.restore(save); - } else { - present = this._peekTag(input, tag, state.any); - - if (input.isError(present)) - return present; - } - } - - // Push object on stack - var prevObj; - if (state.obj && present) - prevObj = input.enterObject(); - - if (present) { - // Unwrap explicit values - if (state.explicit !== null) { - var explicit = this._decodeTag(input, state.explicit); - if (input.isError(explicit)) - return explicit; - input = explicit; - } - - var start = input.offset; - - // Unwrap implicit and normal values - if (state.use === null && state.choice === null) { - if (state.any) - var save = input.save(); - var body = this._decodeTag( - input, - state.implicit !== null ? state.implicit : state.tag, - state.any - ); - if (input.isError(body)) - return body; - - if (state.any) - result = input.raw(save); - else - input = body; - } - - if (options && options.track && state.tag !== null) - options.track(input.path(), start, input.length, 'tagged'); - - if (options && options.track && state.tag !== null) - options.track(input.path(), input.offset, input.length, 'content'); - - // Select proper method for tag - if (state.any) - result = result; - else if (state.choice === null) - result = this._decodeGeneric(state.tag, input, options); - else - result = this._decodeChoice(input, options); - - if (input.isError(result)) - return result; - - // Decode children - if (!state.any && state.choice === null && state.children !== null) { - state.children.forEach(function decodeChildren(child) { - // NOTE: We are ignoring errors here, to let parser continue with other - // parts of encoded data - child._decode(input, options); - }); - } - - // Decode contained/encoded by schema, only in bit or octet strings - if (state.contains && (state.tag === 'octstr' || state.tag === 'bitstr')) { - var data = new DecoderBuffer(result); - result = this._getUse(state.contains, input._reporterState.obj) - ._decode(data, options); - } - } - - // Pop object - if (state.obj && present) - result = input.leaveObject(prevObj); - - // Set key - if (state.key !== null && (result !== null || present === true)) - input.leaveKey(prevKey, state.key, result); - else if (prevKey !== null) - input.exitKey(prevKey); - - return result; -}; - -Node.prototype._decodeGeneric = function decodeGeneric(tag, input, options) { - var state = this._baseState; - - if (tag === 'seq' || tag === 'set') - return null; - if (tag === 'seqof' || tag === 'setof') - return this._decodeList(input, tag, state.args[0], options); - else if (/str$/.test(tag)) - return this._decodeStr(input, tag, options); - else if (tag === 'objid' && state.args) - return this._decodeObjid(input, state.args[0], state.args[1], options); - else if (tag === 'objid') - return this._decodeObjid(input, null, null, options); - else if (tag === 'gentime' || tag === 'utctime') - return this._decodeTime(input, tag, options); - else if (tag === 'null_') - return this._decodeNull(input, options); - else if (tag === 'bool') - return this._decodeBool(input, options); - else if (tag === 'objDesc') - return this._decodeStr(input, tag, options); - else if (tag === 'int' || tag === 'enum') - return this._decodeInt(input, state.args && state.args[0], options); - - if (state.use !== null) { - return this._getUse(state.use, input._reporterState.obj) - ._decode(input, options); - } else { - return input.error('unknown tag: ' + tag); - } -}; - -Node.prototype._getUse = function _getUse(entity, obj) { - - var state = this._baseState; - // Create altered use decoder if implicit is set - state.useDecoder = this._use(entity, obj); - assert(state.useDecoder._baseState.parent === null); - state.useDecoder = state.useDecoder._baseState.children[0]; - if (state.implicit !== state.useDecoder._baseState.implicit) { - state.useDecoder = state.useDecoder.clone(); - state.useDecoder._baseState.implicit = state.implicit; - } - return state.useDecoder; -}; - -Node.prototype._decodeChoice = function decodeChoice(input, options) { - var state = this._baseState; - var result = null; - var match = false; - - Object.keys(state.choice).some(function(key) { - var save = input.save(); - var node = state.choice[key]; - try { - var value = node._decode(input, options); - if (input.isError(value)) - return false; - - result = { type: key, value: value }; - match = true; - } catch (e) { - input.restore(save); - return false; - } - return true; - }, this); - - if (!match) - return input.error('Choice not matched'); - - return result; -}; - -// -// Encoding -// - -Node.prototype._createEncoderBuffer = function createEncoderBuffer(data) { - return new EncoderBuffer(data, this.reporter); -}; - -Node.prototype._encode = function encode(data, reporter, parent) { - var state = this._baseState; - if (state['default'] !== null && state['default'] === data) - return; - - var result = this._encodeValue(data, reporter, parent); - if (result === undefined) - return; - - if (this._skipDefault(result, reporter, parent)) - return; - - return result; -}; - -Node.prototype._encodeValue = function encode(data, reporter, parent) { - var state = this._baseState; - - // Decode root node - if (state.parent === null) - return state.children[0]._encode(data, reporter || new Reporter()); - - var result = null; - - // Set reporter to share it with a child class - this.reporter = reporter; - - // Check if data is there - if (state.optional && data === undefined) { - if (state['default'] !== null) - data = state['default'] - else - return; - } - - // Encode children first - var content = null; - var primitive = false; - if (state.any) { - // Anything that was given is translated to buffer - result = this._createEncoderBuffer(data); - } else if (state.choice) { - result = this._encodeChoice(data, reporter); - } else if (state.contains) { - content = this._getUse(state.contains, parent)._encode(data, reporter); - primitive = true; - } else if (state.children) { - content = state.children.map(function(child) { - if (child._baseState.tag === 'null_') - return child._encode(null, reporter, data); - - if (child._baseState.key === null) - return reporter.error('Child should have a key'); - var prevKey = reporter.enterKey(child._baseState.key); - - if (typeof data !== 'object') - return reporter.error('Child expected, but input is not object'); - - var res = child._encode(data[child._baseState.key], reporter, data); - reporter.leaveKey(prevKey); - - return res; - }, this).filter(function(child) { - return child; - }); - content = this._createEncoderBuffer(content); - } else { - if (state.tag === 'seqof' || state.tag === 'setof') { - // TODO(indutny): this should be thrown on DSL level - if (!(state.args && state.args.length === 1)) - return reporter.error('Too many args for : ' + state.tag); - - if (!Array.isArray(data)) - return reporter.error('seqof/setof, but data is not Array'); - - var child = this.clone(); - child._baseState.implicit = null; - content = this._createEncoderBuffer(data.map(function(item) { - var state = this._baseState; - - return this._getUse(state.args[0], data)._encode(item, reporter); - }, child)); - } else if (state.use !== null) { - result = this._getUse(state.use, parent)._encode(data, reporter); - } else { - content = this._encodePrimitive(state.tag, data); - primitive = true; - } - } - - // Encode data itself - var result; - if (!state.any && state.choice === null) { - var tag = state.implicit !== null ? state.implicit : state.tag; - var cls = state.implicit === null ? 'universal' : 'context'; - - if (tag === null) { - if (state.use === null) - reporter.error('Tag could be omitted only for .use()'); - } else { - if (state.use === null) - result = this._encodeComposite(tag, primitive, cls, content); - } - } - - // Wrap in explicit - if (state.explicit !== null) - result = this._encodeComposite(state.explicit, false, 'context', result); - - return result; -}; - -Node.prototype._encodeChoice = function encodeChoice(data, reporter) { - var state = this._baseState; - - var node = state.choice[data.type]; - if (!node) { - assert( - false, - data.type + ' not found in ' + - JSON.stringify(Object.keys(state.choice))); - } - return node._encode(data.value, reporter); -}; - -Node.prototype._encodePrimitive = function encodePrimitive(tag, data) { - var state = this._baseState; - - if (/str$/.test(tag)) - return this._encodeStr(data, tag); - else if (tag === 'objid' && state.args) - return this._encodeObjid(data, state.reverseArgs[0], state.args[1]); - else if (tag === 'objid') - return this._encodeObjid(data, null, null); - else if (tag === 'gentime' || tag === 'utctime') - return this._encodeTime(data, tag); - else if (tag === 'null_') - return this._encodeNull(); - else if (tag === 'int' || tag === 'enum') - return this._encodeInt(data, state.args && state.reverseArgs[0]); - else if (tag === 'bool') - return this._encodeBool(data); - else if (tag === 'objDesc') - return this._encodeStr(data, tag); - else - throw new Error('Unsupported tag: ' + tag); -}; - -Node.prototype._isNumstr = function isNumstr(str) { - return /^[0-9 ]*$/.test(str); -}; - -Node.prototype._isPrintstr = function isPrintstr(str) { - return /^[A-Za-z0-9 '\(\)\+,\-\.\/:=\?]*$/.test(str); -}; - -},{"../base":"L0i5","minimalistic-assert":"MpuC"}],"L0i5":[function(require,module,exports) { -var base = exports; - -base.Reporter = require('./reporter').Reporter; -base.DecoderBuffer = require('./buffer').DecoderBuffer; -base.EncoderBuffer = require('./buffer').EncoderBuffer; -base.Node = require('./node'); - -},{"./reporter":"YMUn","./buffer":"K43q","./node":"trF9"}],"AO6U":[function(require,module,exports) { -var constants = require('../constants'); - -exports.tagClass = { - 0: 'universal', - 1: 'application', - 2: 'context', - 3: 'private' -}; -exports.tagClassByName = constants._reverse(exports.tagClass); - -exports.tag = { - 0x00: 'end', - 0x01: 'bool', - 0x02: 'int', - 0x03: 'bitstr', - 0x04: 'octstr', - 0x05: 'null_', - 0x06: 'objid', - 0x07: 'objDesc', - 0x08: 'external', - 0x09: 'real', - 0x0a: 'enum', - 0x0b: 'embed', - 0x0c: 'utf8str', - 0x0d: 'relativeOid', - 0x10: 'seq', - 0x11: 'set', - 0x12: 'numstr', - 0x13: 'printstr', - 0x14: 't61str', - 0x15: 'videostr', - 0x16: 'ia5str', - 0x17: 'utctime', - 0x18: 'gentime', - 0x19: 'graphstr', - 0x1a: 'iso646str', - 0x1b: 'genstr', - 0x1c: 'unistr', - 0x1d: 'charstr', - 0x1e: 'bmpstr' -}; -exports.tagByName = constants._reverse(exports.tag); - -},{"../constants":"Wtaj"}],"Wtaj":[function(require,module,exports) { -var constants = exports; - -// Helper -constants._reverse = function reverse(map) { - var res = {}; - - Object.keys(map).forEach(function(key) { - // Convert key to integer if it is stringified - if ((key | 0) == key) - key = key | 0; - - var value = map[key]; - res[value] = key; - }); - - return res; -}; - -constants.der = require('./der'); - -},{"./der":"AO6U"}],"VcmQ":[function(require,module,exports) { -var inherits = require('inherits'); - -var asn1 = require('../../asn1'); -var base = asn1.base; -var bignum = asn1.bignum; - -// Import DER constants -var der = asn1.constants.der; - -function DERDecoder(entity) { - this.enc = 'der'; - this.name = entity.name; - this.entity = entity; - - // Construct base tree - this.tree = new DERNode(); - this.tree._init(entity.body); -}; -module.exports = DERDecoder; - -DERDecoder.prototype.decode = function decode(data, options) { - if (!(data instanceof base.DecoderBuffer)) - data = new base.DecoderBuffer(data, options); - - return this.tree._decode(data, options); -}; - -// Tree methods - -function DERNode(parent) { - base.Node.call(this, 'der', parent); -} -inherits(DERNode, base.Node); - -DERNode.prototype._peekTag = function peekTag(buffer, tag, any) { - if (buffer.isEmpty()) - return false; - - var state = buffer.save(); - var decodedTag = derDecodeTag(buffer, 'Failed to peek tag: "' + tag + '"'); - if (buffer.isError(decodedTag)) - return decodedTag; - - buffer.restore(state); - - return decodedTag.tag === tag || decodedTag.tagStr === tag || - (decodedTag.tagStr + 'of') === tag || any; -}; - -DERNode.prototype._decodeTag = function decodeTag(buffer, tag, any) { - var decodedTag = derDecodeTag(buffer, - 'Failed to decode tag of "' + tag + '"'); - if (buffer.isError(decodedTag)) - return decodedTag; - - var len = derDecodeLen(buffer, - decodedTag.primitive, - 'Failed to get length of "' + tag + '"'); - - // Failure - if (buffer.isError(len)) - return len; - - if (!any && - decodedTag.tag !== tag && - decodedTag.tagStr !== tag && - decodedTag.tagStr + 'of' !== tag) { - return buffer.error('Failed to match tag: "' + tag + '"'); - } - - if (decodedTag.primitive || len !== null) - return buffer.skip(len, 'Failed to match body of: "' + tag + '"'); - - // Indefinite length... find END tag - var state = buffer.save(); - var res = this._skipUntilEnd( - buffer, - 'Failed to skip indefinite length body: "' + this.tag + '"'); - if (buffer.isError(res)) - return res; - - len = buffer.offset - state.offset; - buffer.restore(state); - return buffer.skip(len, 'Failed to match body of: "' + tag + '"'); -}; - -DERNode.prototype._skipUntilEnd = function skipUntilEnd(buffer, fail) { - while (true) { - var tag = derDecodeTag(buffer, fail); - if (buffer.isError(tag)) - return tag; - var len = derDecodeLen(buffer, tag.primitive, fail); - if (buffer.isError(len)) - return len; - - var res; - if (tag.primitive || len !== null) - res = buffer.skip(len) - else - res = this._skipUntilEnd(buffer, fail); - - // Failure - if (buffer.isError(res)) - return res; - - if (tag.tagStr === 'end') - break; - } -}; - -DERNode.prototype._decodeList = function decodeList(buffer, tag, decoder, - options) { - var result = []; - while (!buffer.isEmpty()) { - var possibleEnd = this._peekTag(buffer, 'end'); - if (buffer.isError(possibleEnd)) - return possibleEnd; - - var res = decoder.decode(buffer, 'der', options); - if (buffer.isError(res) && possibleEnd) - break; - result.push(res); - } - return result; -}; - -DERNode.prototype._decodeStr = function decodeStr(buffer, tag) { - if (tag === 'bitstr') { - var unused = buffer.readUInt8(); - if (buffer.isError(unused)) - return unused; - return { unused: unused, data: buffer.raw() }; - } else if (tag === 'bmpstr') { - var raw = buffer.raw(); - if (raw.length % 2 === 1) - return buffer.error('Decoding of string type: bmpstr length mismatch'); - - var str = ''; - for (var i = 0; i < raw.length / 2; i++) { - str += String.fromCharCode(raw.readUInt16BE(i * 2)); - } - return str; - } else if (tag === 'numstr') { - var numstr = buffer.raw().toString('ascii'); - if (!this._isNumstr(numstr)) { - return buffer.error('Decoding of string type: ' + - 'numstr unsupported characters'); - } - return numstr; - } else if (tag === 'octstr') { - return buffer.raw(); - } else if (tag === 'objDesc') { - return buffer.raw(); - } else if (tag === 'printstr') { - var printstr = buffer.raw().toString('ascii'); - if (!this._isPrintstr(printstr)) { - return buffer.error('Decoding of string type: ' + - 'printstr unsupported characters'); - } - return printstr; - } else if (/str$/.test(tag)) { - return buffer.raw().toString(); - } else { - return buffer.error('Decoding of string type: ' + tag + ' unsupported'); - } -}; - -DERNode.prototype._decodeObjid = function decodeObjid(buffer, values, relative) { - var result; - var identifiers = []; - var ident = 0; - while (!buffer.isEmpty()) { - var subident = buffer.readUInt8(); - ident <<= 7; - ident |= subident & 0x7f; - if ((subident & 0x80) === 0) { - identifiers.push(ident); - ident = 0; - } - } - if (subident & 0x80) - identifiers.push(ident); - - var first = (identifiers[0] / 40) | 0; - var second = identifiers[0] % 40; - - if (relative) - result = identifiers; - else - result = [first, second].concat(identifiers.slice(1)); - - if (values) { - var tmp = values[result.join(' ')]; - if (tmp === undefined) - tmp = values[result.join('.')]; - if (tmp !== undefined) - result = tmp; - } - - return result; -}; - -DERNode.prototype._decodeTime = function decodeTime(buffer, tag) { - var str = buffer.raw().toString(); - if (tag === 'gentime') { - var year = str.slice(0, 4) | 0; - var mon = str.slice(4, 6) | 0; - var day = str.slice(6, 8) | 0; - var hour = str.slice(8, 10) | 0; - var min = str.slice(10, 12) | 0; - var sec = str.slice(12, 14) | 0; - } else if (tag === 'utctime') { - var year = str.slice(0, 2) | 0; - var mon = str.slice(2, 4) | 0; - var day = str.slice(4, 6) | 0; - var hour = str.slice(6, 8) | 0; - var min = str.slice(8, 10) | 0; - var sec = str.slice(10, 12) | 0; - if (year < 70) - year = 2000 + year; - else - year = 1900 + year; - } else { - return buffer.error('Decoding ' + tag + ' time is not supported yet'); - } - - return Date.UTC(year, mon - 1, day, hour, min, sec, 0); -}; - -DERNode.prototype._decodeNull = function decodeNull(buffer) { - return null; -}; - -DERNode.prototype._decodeBool = function decodeBool(buffer) { - var res = buffer.readUInt8(); - if (buffer.isError(res)) - return res; - else - return res !== 0; -}; - -DERNode.prototype._decodeInt = function decodeInt(buffer, values) { - // Bigint, return as it is (assume big endian) - var raw = buffer.raw(); - var res = new bignum(raw); - - if (values) - res = values[res.toString(10)] || res; - - return res; -}; - -DERNode.prototype._use = function use(entity, obj) { - if (typeof entity === 'function') - entity = entity(obj); - return entity._getDecoder('der').tree; -}; - -// Utility methods - -function derDecodeTag(buf, fail) { - var tag = buf.readUInt8(fail); - if (buf.isError(tag)) - return tag; - - var cls = der.tagClass[tag >> 6]; - var primitive = (tag & 0x20) === 0; - - // Multi-octet tag - load - if ((tag & 0x1f) === 0x1f) { - var oct = tag; - tag = 0; - while ((oct & 0x80) === 0x80) { - oct = buf.readUInt8(fail); - if (buf.isError(oct)) - return oct; - - tag <<= 7; - tag |= oct & 0x7f; - } - } else { - tag &= 0x1f; - } - var tagStr = der.tag[tag]; - - return { - cls: cls, - primitive: primitive, - tag: tag, - tagStr: tagStr - }; -} - -function derDecodeLen(buf, primitive, fail) { - var len = buf.readUInt8(fail); - if (buf.isError(len)) - return len; - - // Indefinite form - if (!primitive && len === 0x80) - return null; - - // Definite form - if ((len & 0x80) === 0) { - // Short form - return len; - } - - // Long form - var num = len & 0x7f; - if (num > 4) - return buf.error('length octect is too long'); - - len = 0; - for (var i = 0; i < num; i++) { - len <<= 8; - var j = buf.readUInt8(fail); - if (buf.isError(j)) - return j; - len |= j; - } - - return len; -} - -},{"inherits":"Bm0n","../../asn1":"ZCez"}],"lCPy":[function(require,module,exports) { - -var inherits = require('inherits'); -var Buffer = require('buffer').Buffer; - -var DERDecoder = require('./der'); - -function PEMDecoder(entity) { - DERDecoder.call(this, entity); - this.enc = 'pem'; -}; -inherits(PEMDecoder, DERDecoder); -module.exports = PEMDecoder; - -PEMDecoder.prototype.decode = function decode(data, options) { - var lines = data.toString().split(/[\r\n]+/g); - - var label = options.label.toUpperCase(); - - var re = /^-----(BEGIN|END) ([^-]+)-----$/; - var start = -1; - var end = -1; - for (var i = 0; i < lines.length; i++) { - var match = lines[i].match(re); - if (match === null) - continue; - - if (match[2] !== label) - continue; - - if (start === -1) { - if (match[1] !== 'BEGIN') - break; - start = i; - } else { - if (match[1] !== 'END') - break; - end = i; - break; - } - } - if (start === -1 || end === -1) - throw new Error('PEM section not found for: ' + label); - - var base64 = lines.slice(start + 1, end).join(''); - // Remove excessive symbols - base64.replace(/[^a-z0-9\+\/=]+/gi, ''); - - var input = new Buffer(base64, 'base64'); - return DERDecoder.prototype.decode.call(this, input, options); -}; - -},{"inherits":"Bm0n","buffer":"dskh","./der":"VcmQ"}],"FERm":[function(require,module,exports) { -var decoders = exports; - -decoders.der = require('./der'); -decoders.pem = require('./pem'); - -},{"./der":"VcmQ","./pem":"lCPy"}],"upsI":[function(require,module,exports) { - -var inherits = require('inherits'); -var Buffer = require('buffer').Buffer; - -var asn1 = require('../../asn1'); -var base = asn1.base; - -// Import DER constants -var der = asn1.constants.der; - -function DEREncoder(entity) { - this.enc = 'der'; - this.name = entity.name; - this.entity = entity; - - // Construct base tree - this.tree = new DERNode(); - this.tree._init(entity.body); -}; -module.exports = DEREncoder; - -DEREncoder.prototype.encode = function encode(data, reporter) { - return this.tree._encode(data, reporter).join(); -}; - -// Tree methods - -function DERNode(parent) { - base.Node.call(this, 'der', parent); -} -inherits(DERNode, base.Node); - -DERNode.prototype._encodeComposite = function encodeComposite(tag, - primitive, - cls, - content) { - var encodedTag = encodeTag(tag, primitive, cls, this.reporter); - - // Short form - if (content.length < 0x80) { - var header = new Buffer(2); - header[0] = encodedTag; - header[1] = content.length; - return this._createEncoderBuffer([ header, content ]); - } - - // Long form - // Count octets required to store length - var lenOctets = 1; - for (var i = content.length; i >= 0x100; i >>= 8) - lenOctets++; - - var header = new Buffer(1 + 1 + lenOctets); - header[0] = encodedTag; - header[1] = 0x80 | lenOctets; - - for (var i = 1 + lenOctets, j = content.length; j > 0; i--, j >>= 8) - header[i] = j & 0xff; - - return this._createEncoderBuffer([ header, content ]); -}; - -DERNode.prototype._encodeStr = function encodeStr(str, tag) { - if (tag === 'bitstr') { - return this._createEncoderBuffer([ str.unused | 0, str.data ]); - } else if (tag === 'bmpstr') { - var buf = new Buffer(str.length * 2); - for (var i = 0; i < str.length; i++) { - buf.writeUInt16BE(str.charCodeAt(i), i * 2); - } - return this._createEncoderBuffer(buf); - } else if (tag === 'numstr') { - if (!this._isNumstr(str)) { - return this.reporter.error('Encoding of string type: numstr supports ' + - 'only digits and space'); - } - return this._createEncoderBuffer(str); - } else if (tag === 'printstr') { - if (!this._isPrintstr(str)) { - return this.reporter.error('Encoding of string type: printstr supports ' + - 'only latin upper and lower case letters, ' + - 'digits, space, apostrophe, left and rigth ' + - 'parenthesis, plus sign, comma, hyphen, ' + - 'dot, slash, colon, equal sign, ' + - 'question mark'); - } - return this._createEncoderBuffer(str); - } else if (/str$/.test(tag)) { - return this._createEncoderBuffer(str); - } else if (tag === 'objDesc') { - return this._createEncoderBuffer(str); - } else { - return this.reporter.error('Encoding of string type: ' + tag + - ' unsupported'); - } -}; - -DERNode.prototype._encodeObjid = function encodeObjid(id, values, relative) { - if (typeof id === 'string') { - if (!values) - return this.reporter.error('string objid given, but no values map found'); - if (!values.hasOwnProperty(id)) - return this.reporter.error('objid not found in values map'); - id = values[id].split(/[\s\.]+/g); - for (var i = 0; i < id.length; i++) - id[i] |= 0; - } else if (Array.isArray(id)) { - id = id.slice(); - for (var i = 0; i < id.length; i++) - id[i] |= 0; - } - - if (!Array.isArray(id)) { - return this.reporter.error('objid() should be either array or string, ' + - 'got: ' + JSON.stringify(id)); - } - - if (!relative) { - if (id[1] >= 40) - return this.reporter.error('Second objid identifier OOB'); - id.splice(0, 2, id[0] * 40 + id[1]); - } - - // Count number of octets - var size = 0; - for (var i = 0; i < id.length; i++) { - var ident = id[i]; - for (size++; ident >= 0x80; ident >>= 7) - size++; - } - - var objid = new Buffer(size); - var offset = objid.length - 1; - for (var i = id.length - 1; i >= 0; i--) { - var ident = id[i]; - objid[offset--] = ident & 0x7f; - while ((ident >>= 7) > 0) - objid[offset--] = 0x80 | (ident & 0x7f); - } - - return this._createEncoderBuffer(objid); -}; - -function two(num) { - if (num < 10) - return '0' + num; - else - return num; -} - -DERNode.prototype._encodeTime = function encodeTime(time, tag) { - var str; - var date = new Date(time); - - if (tag === 'gentime') { - str = [ - two(date.getFullYear()), - two(date.getUTCMonth() + 1), - two(date.getUTCDate()), - two(date.getUTCHours()), - two(date.getUTCMinutes()), - two(date.getUTCSeconds()), - 'Z' - ].join(''); - } else if (tag === 'utctime') { - str = [ - two(date.getFullYear() % 100), - two(date.getUTCMonth() + 1), - two(date.getUTCDate()), - two(date.getUTCHours()), - two(date.getUTCMinutes()), - two(date.getUTCSeconds()), - 'Z' - ].join(''); - } else { - this.reporter.error('Encoding ' + tag + ' time is not supported yet'); - } - - return this._encodeStr(str, 'octstr'); -}; - -DERNode.prototype._encodeNull = function encodeNull() { - return this._createEncoderBuffer(''); -}; - -DERNode.prototype._encodeInt = function encodeInt(num, values) { - if (typeof num === 'string') { - if (!values) - return this.reporter.error('String int or enum given, but no values map'); - if (!values.hasOwnProperty(num)) { - return this.reporter.error('Values map doesn\'t contain: ' + - JSON.stringify(num)); - } - num = values[num]; - } - - // Bignum, assume big endian - if (typeof num !== 'number' && !Buffer.isBuffer(num)) { - var numArray = num.toArray(); - if (!num.sign && numArray[0] & 0x80) { - numArray.unshift(0); - } - num = new Buffer(numArray); - } - - if (Buffer.isBuffer(num)) { - var size = num.length; - if (num.length === 0) - size++; - - var out = new Buffer(size); - num.copy(out); - if (num.length === 0) - out[0] = 0 - return this._createEncoderBuffer(out); - } - - if (num < 0x80) - return this._createEncoderBuffer(num); - - if (num < 0x100) - return this._createEncoderBuffer([0, num]); - - var size = 1; - for (var i = num; i >= 0x100; i >>= 8) - size++; - - var out = new Array(size); - for (var i = out.length - 1; i >= 0; i--) { - out[i] = num & 0xff; - num >>= 8; - } - if(out[0] & 0x80) { - out.unshift(0); - } - - return this._createEncoderBuffer(new Buffer(out)); -}; - -DERNode.prototype._encodeBool = function encodeBool(value) { - return this._createEncoderBuffer(value ? 0xff : 0); -}; - -DERNode.prototype._use = function use(entity, obj) { - if (typeof entity === 'function') - entity = entity(obj); - return entity._getEncoder('der').tree; -}; - -DERNode.prototype._skipDefault = function skipDefault(dataBuffer, reporter, parent) { - var state = this._baseState; - var i; - if (state['default'] === null) - return false; - - var data = dataBuffer.join(); - if (state.defaultBuffer === undefined) - state.defaultBuffer = this._encodeValue(state['default'], reporter, parent).join(); - - if (data.length !== state.defaultBuffer.length) - return false; - - for (i=0; i < data.length; i++) - if (data[i] !== state.defaultBuffer[i]) - return false; - - return true; -}; - -// Utility methods - -function encodeTag(tag, primitive, cls, reporter) { - var res; - - if (tag === 'seqof') - tag = 'seq'; - else if (tag === 'setof') - tag = 'set'; - - if (der.tagByName.hasOwnProperty(tag)) - res = der.tagByName[tag]; - else if (typeof tag === 'number' && (tag | 0) === tag) - res = tag; - else - return reporter.error('Unknown tag: ' + tag); - - if (res >= 0x1f) - return reporter.error('Multi-octet tag encoding unsupported'); - - if (!primitive) - res |= 0x20; - - res |= (der.tagClassByName[cls || 'universal'] << 6); - - return res; -} - -},{"inherits":"Bm0n","buffer":"dskh","../../asn1":"ZCez"}],"kikR":[function(require,module,exports) { -var inherits = require('inherits'); - -var DEREncoder = require('./der'); - -function PEMEncoder(entity) { - DEREncoder.call(this, entity); - this.enc = 'pem'; -}; -inherits(PEMEncoder, DEREncoder); -module.exports = PEMEncoder; - -PEMEncoder.prototype.encode = function encode(data, options) { - var buf = DEREncoder.prototype.encode.call(this, data); - - var p = buf.toString('base64'); - var out = [ '-----BEGIN ' + options.label + '-----' ]; - for (var i = 0; i < p.length; i += 64) - out.push(p.slice(i, i + 64)); - out.push('-----END ' + options.label + '-----'); - return out.join('\n'); -}; - -},{"inherits":"Bm0n","./der":"upsI"}],"XNDN":[function(require,module,exports) { -var encoders = exports; - -encoders.der = require('./der'); -encoders.pem = require('./pem'); - -},{"./der":"upsI","./pem":"kikR"}],"ZCez":[function(require,module,exports) { -var asn1 = exports; - -asn1.bignum = require('bn.js'); - -asn1.define = require('./asn1/api').define; -asn1.base = require('./asn1/base'); -asn1.constants = require('./asn1/constants'); -asn1.decoders = require('./asn1/decoders'); -asn1.encoders = require('./asn1/encoders'); - -},{"bn.js":"BOxy","./asn1/api":"mvP6","./asn1/base":"L0i5","./asn1/constants":"Wtaj","./asn1/decoders":"FERm","./asn1/encoders":"XNDN"}],"XsN6":[function(require,module,exports) { -// from https://github.com/Rantanen/node-dtls/blob/25a7dc861bda38cfeac93a723500eea4f0ac2e86/Certificate.js -// thanks to @Rantanen - -'use strict' - -var asn = require('asn1.js') - -var Time = asn.define('Time', function () { - this.choice({ - utcTime: this.utctime(), - generalTime: this.gentime() - }) -}) - -var AttributeTypeValue = asn.define('AttributeTypeValue', function () { - this.seq().obj( - this.key('type').objid(), - this.key('value').any() - ) -}) - -var AlgorithmIdentifier = asn.define('AlgorithmIdentifier', function () { - this.seq().obj( - this.key('algorithm').objid(), - this.key('parameters').optional(), - this.key('curve').objid().optional() - ) -}) - -var SubjectPublicKeyInfo = asn.define('SubjectPublicKeyInfo', function () { - this.seq().obj( - this.key('algorithm').use(AlgorithmIdentifier), - this.key('subjectPublicKey').bitstr() - ) -}) - -var RelativeDistinguishedName = asn.define('RelativeDistinguishedName', function () { - this.setof(AttributeTypeValue) -}) - -var RDNSequence = asn.define('RDNSequence', function () { - this.seqof(RelativeDistinguishedName) -}) - -var Name = asn.define('Name', function () { - this.choice({ - rdnSequence: this.use(RDNSequence) - }) -}) - -var Validity = asn.define('Validity', function () { - this.seq().obj( - this.key('notBefore').use(Time), - this.key('notAfter').use(Time) - ) -}) - -var Extension = asn.define('Extension', function () { - this.seq().obj( - this.key('extnID').objid(), - this.key('critical').bool().def(false), - this.key('extnValue').octstr() - ) -}) - -var TBSCertificate = asn.define('TBSCertificate', function () { - this.seq().obj( - this.key('version').explicit(0).int().optional(), - this.key('serialNumber').int(), - this.key('signature').use(AlgorithmIdentifier), - this.key('issuer').use(Name), - this.key('validity').use(Validity), - this.key('subject').use(Name), - this.key('subjectPublicKeyInfo').use(SubjectPublicKeyInfo), - this.key('issuerUniqueID').implicit(1).bitstr().optional(), - this.key('subjectUniqueID').implicit(2).bitstr().optional(), - this.key('extensions').explicit(3).seqof(Extension).optional() - ) -}) - -var X509Certificate = asn.define('X509Certificate', function () { - this.seq().obj( - this.key('tbsCertificate').use(TBSCertificate), - this.key('signatureAlgorithm').use(AlgorithmIdentifier), - this.key('signatureValue').bitstr() - ) -}) - -module.exports = X509Certificate - -},{"asn1.js":"ZCez"}],"hfk5":[function(require,module,exports) { -// from https://github.com/indutny/self-signed/blob/gh-pages/lib/asn1.js -// Fedor, you are amazing. -'use strict' - -var asn1 = require('asn1.js') - -exports.certificate = require('./certificate') - -var RSAPrivateKey = asn1.define('RSAPrivateKey', function () { - this.seq().obj( - this.key('version').int(), - this.key('modulus').int(), - this.key('publicExponent').int(), - this.key('privateExponent').int(), - this.key('prime1').int(), - this.key('prime2').int(), - this.key('exponent1').int(), - this.key('exponent2').int(), - this.key('coefficient').int() - ) -}) -exports.RSAPrivateKey = RSAPrivateKey - -var RSAPublicKey = asn1.define('RSAPublicKey', function () { - this.seq().obj( - this.key('modulus').int(), - this.key('publicExponent').int() - ) -}) -exports.RSAPublicKey = RSAPublicKey - -var PublicKey = asn1.define('SubjectPublicKeyInfo', function () { - this.seq().obj( - this.key('algorithm').use(AlgorithmIdentifier), - this.key('subjectPublicKey').bitstr() - ) -}) -exports.PublicKey = PublicKey - -var AlgorithmIdentifier = asn1.define('AlgorithmIdentifier', function () { - this.seq().obj( - this.key('algorithm').objid(), - this.key('none').null_().optional(), - this.key('curve').objid().optional(), - this.key('params').seq().obj( - this.key('p').int(), - this.key('q').int(), - this.key('g').int() - ).optional() - ) -}) - -var PrivateKeyInfo = asn1.define('PrivateKeyInfo', function () { - this.seq().obj( - this.key('version').int(), - this.key('algorithm').use(AlgorithmIdentifier), - this.key('subjectPrivateKey').octstr() - ) -}) -exports.PrivateKey = PrivateKeyInfo -var EncryptedPrivateKeyInfo = asn1.define('EncryptedPrivateKeyInfo', function () { - this.seq().obj( - this.key('algorithm').seq().obj( - this.key('id').objid(), - this.key('decrypt').seq().obj( - this.key('kde').seq().obj( - this.key('id').objid(), - this.key('kdeparams').seq().obj( - this.key('salt').octstr(), - this.key('iters').int() - ) - ), - this.key('cipher').seq().obj( - this.key('algo').objid(), - this.key('iv').octstr() - ) - ) - ), - this.key('subjectPrivateKey').octstr() - ) -}) - -exports.EncryptedPrivateKey = EncryptedPrivateKeyInfo - -var DSAPrivateKey = asn1.define('DSAPrivateKey', function () { - this.seq().obj( - this.key('version').int(), - this.key('p').int(), - this.key('q').int(), - this.key('g').int(), - this.key('pub_key').int(), - this.key('priv_key').int() - ) -}) -exports.DSAPrivateKey = DSAPrivateKey - -exports.DSAparam = asn1.define('DSAparam', function () { - this.int() -}) - -var ECPrivateKey = asn1.define('ECPrivateKey', function () { - this.seq().obj( - this.key('version').int(), - this.key('privateKey').octstr(), - this.key('parameters').optional().explicit(0).use(ECParameters), - this.key('publicKey').optional().explicit(1).bitstr() - ) -}) -exports.ECPrivateKey = ECPrivateKey - -var ECParameters = asn1.define('ECParameters', function () { - this.choice({ - namedCurve: this.objid() - }) -}) - -exports.signature = asn1.define('signature', function () { - this.seq().obj( - this.key('r').int(), - this.key('s').int() - ) -}) - -},{"asn1.js":"ZCez","./certificate":"XsN6"}],"QyaF":[function(require,module,exports) { -module.exports = {"2.16.840.1.101.3.4.1.1": "aes-128-ecb", -"2.16.840.1.101.3.4.1.2": "aes-128-cbc", -"2.16.840.1.101.3.4.1.3": "aes-128-ofb", -"2.16.840.1.101.3.4.1.4": "aes-128-cfb", -"2.16.840.1.101.3.4.1.21": "aes-192-ecb", -"2.16.840.1.101.3.4.1.22": "aes-192-cbc", -"2.16.840.1.101.3.4.1.23": "aes-192-ofb", -"2.16.840.1.101.3.4.1.24": "aes-192-cfb", -"2.16.840.1.101.3.4.1.41": "aes-256-ecb", -"2.16.840.1.101.3.4.1.42": "aes-256-cbc", -"2.16.840.1.101.3.4.1.43": "aes-256-ofb", -"2.16.840.1.101.3.4.1.44": "aes-256-cfb" -}; -},{}],"PyvQ":[function(require,module,exports) { - -// adapted from https://github.com/apatil/pemstrip -var findProc = /Proc-Type: 4,ENCRYPTED[\n\r]+DEK-Info: AES-((?:128)|(?:192)|(?:256))-CBC,([0-9A-H]+)[\n\r]+([0-9A-z\n\r\+\/\=]+)[\n\r]+/m -var startRegex = /^-----BEGIN ((?:.*? KEY)|CERTIFICATE)-----/m -var fullRegex = /^-----BEGIN ((?:.*? KEY)|CERTIFICATE)-----([0-9A-z\n\r\+\/\=]+)-----END \1-----$/m -var evp = require('evp_bytestokey') -var ciphers = require('browserify-aes') -var Buffer = require('safe-buffer').Buffer -module.exports = function (okey, password) { - var key = okey.toString() - var match = key.match(findProc) - var decrypted - if (!match) { - var match2 = key.match(fullRegex) - decrypted = new Buffer(match2[2].replace(/[\r\n]/g, ''), 'base64') - } else { - var suite = 'aes' + match[1] - var iv = Buffer.from(match[2], 'hex') - var cipherText = Buffer.from(match[3].replace(/[\r\n]/g, ''), 'base64') - var cipherKey = evp(password, iv.slice(0, 8), parseInt(match[1], 10)).key - var out = [] - var cipher = ciphers.createDecipheriv(suite, cipherKey, iv) - out.push(cipher.update(cipherText)) - out.push(cipher.final()) - decrypted = Buffer.concat(out) - } - var tag = key.match(startRegex)[1] - return { - tag: tag, - data: decrypted - } -} - -},{"evp_bytestokey":"exU6","browserify-aes":"hisC","safe-buffer":"Wugr"}],"g6E9":[function(require,module,exports) { - -var asn1 = require('./asn1') -var aesid = require('./aesid.json') -var fixProc = require('./fixProc') -var ciphers = require('browserify-aes') -var compat = require('pbkdf2') -var Buffer = require('safe-buffer').Buffer -module.exports = parseKeys - -function parseKeys (buffer) { - var password - if (typeof buffer === 'object' && !Buffer.isBuffer(buffer)) { - password = buffer.passphrase - buffer = buffer.key - } - if (typeof buffer === 'string') { - buffer = Buffer.from(buffer) - } - - var stripped = fixProc(buffer, password) - - var type = stripped.tag - var data = stripped.data - var subtype, ndata - switch (type) { - case 'CERTIFICATE': - ndata = asn1.certificate.decode(data, 'der').tbsCertificate.subjectPublicKeyInfo - // falls through - case 'PUBLIC KEY': - if (!ndata) { - ndata = asn1.PublicKey.decode(data, 'der') - } - subtype = ndata.algorithm.algorithm.join('.') - switch (subtype) { - case '1.2.840.113549.1.1.1': - return asn1.RSAPublicKey.decode(ndata.subjectPublicKey.data, 'der') - case '1.2.840.10045.2.1': - ndata.subjectPrivateKey = ndata.subjectPublicKey - return { - type: 'ec', - data: ndata - } - case '1.2.840.10040.4.1': - ndata.algorithm.params.pub_key = asn1.DSAparam.decode(ndata.subjectPublicKey.data, 'der') - return { - type: 'dsa', - data: ndata.algorithm.params - } - default: throw new Error('unknown key id ' + subtype) - } - throw new Error('unknown key type ' + type) - case 'ENCRYPTED PRIVATE KEY': - data = asn1.EncryptedPrivateKey.decode(data, 'der') - data = decrypt(data, password) - // falls through - case 'PRIVATE KEY': - ndata = asn1.PrivateKey.decode(data, 'der') - subtype = ndata.algorithm.algorithm.join('.') - switch (subtype) { - case '1.2.840.113549.1.1.1': - return asn1.RSAPrivateKey.decode(ndata.subjectPrivateKey, 'der') - case '1.2.840.10045.2.1': - return { - curve: ndata.algorithm.curve, - privateKey: asn1.ECPrivateKey.decode(ndata.subjectPrivateKey, 'der').privateKey - } - case '1.2.840.10040.4.1': - ndata.algorithm.params.priv_key = asn1.DSAparam.decode(ndata.subjectPrivateKey, 'der') - return { - type: 'dsa', - params: ndata.algorithm.params - } - default: throw new Error('unknown key id ' + subtype) - } - throw new Error('unknown key type ' + type) - case 'RSA PUBLIC KEY': - return asn1.RSAPublicKey.decode(data, 'der') - case 'RSA PRIVATE KEY': - return asn1.RSAPrivateKey.decode(data, 'der') - case 'DSA PRIVATE KEY': - return { - type: 'dsa', - params: asn1.DSAPrivateKey.decode(data, 'der') - } - case 'EC PRIVATE KEY': - data = asn1.ECPrivateKey.decode(data, 'der') - return { - curve: data.parameters.value, - privateKey: data.privateKey - } - default: throw new Error('unknown key type ' + type) - } -} -parseKeys.signature = asn1.signature -function decrypt (data, password) { - var salt = data.algorithm.decrypt.kde.kdeparams.salt - var iters = parseInt(data.algorithm.decrypt.kde.kdeparams.iters.toString(), 10) - var algo = aesid[data.algorithm.decrypt.cipher.algo.join('.')] - var iv = data.algorithm.decrypt.cipher.iv - var cipherText = data.subjectPrivateKey - var keylen = parseInt(algo.split('-')[1], 10) / 8 - var key = compat.pbkdf2Sync(password, salt, iters, keylen, 'sha1') - var cipher = ciphers.createDecipheriv(algo, key, iv) - var out = [] - out.push(cipher.update(cipherText)) - out.push(cipher.final()) - return Buffer.concat(out) -} - -},{"./asn1":"hfk5","./aesid.json":"QyaF","./fixProc":"PyvQ","browserify-aes":"hisC","pbkdf2":"BKdu","safe-buffer":"Wugr"}],"lPVM":[function(require,module,exports) { -module.exports = { - "1.3.132.0.10": "secp256k1", - "1.3.132.0.33": "p224", - "1.2.840.10045.3.1.1": "p192", - "1.2.840.10045.3.1.7": "p256", - "1.3.132.0.34": "p384", - "1.3.132.0.35": "p521" -} -; -},{}],"oj83":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -// much of this based on https://github.com/indutny/self-signed/blob/gh-pages/lib/rsa.js -var createHmac = require('create-hmac') -var crt = require('browserify-rsa') -var EC = require('elliptic').ec -var BN = require('bn.js') -var parseKeys = require('parse-asn1') -var curves = require('./curves.json') - -function sign (hash, key, hashType, signType, tag) { - var priv = parseKeys(key) - if (priv.curve) { - // rsa keys can be interpreted as ecdsa ones in openssl - if (signType !== 'ecdsa' && signType !== 'ecdsa/rsa') throw new Error('wrong private key type') - return ecSign(hash, priv) - } else if (priv.type === 'dsa') { - if (signType !== 'dsa') throw new Error('wrong private key type') - return dsaSign(hash, priv, hashType) - } else { - if (signType !== 'rsa' && signType !== 'ecdsa/rsa') throw new Error('wrong private key type') - } - hash = Buffer.concat([tag, hash]) - var len = priv.modulus.byteLength() - var pad = [ 0, 1 ] - while (hash.length + pad.length + 1 < len) pad.push(0xff) - pad.push(0x00) - var i = -1 - while (++i < hash.length) pad.push(hash[i]) - - var out = crt(pad, priv) - return out -} - -function ecSign (hash, priv) { - var curveId = curves[priv.curve.join('.')] - if (!curveId) throw new Error('unknown curve ' + priv.curve.join('.')) - - var curve = new EC(curveId) - var key = curve.keyFromPrivate(priv.privateKey) - var out = key.sign(hash) - - return new Buffer(out.toDER()) -} - -function dsaSign (hash, priv, algo) { - var x = priv.params.priv_key - var p = priv.params.p - var q = priv.params.q - var g = priv.params.g - var r = new BN(0) - var k - var H = bits2int(hash, q).mod(q) - var s = false - var kv = getKey(x, q, hash, algo) - while (s === false) { - k = makeKey(q, kv, algo) - r = makeR(g, k, p, q) - s = k.invm(q).imul(H.add(x.mul(r))).mod(q) - if (s.cmpn(0) === 0) { - s = false - r = new BN(0) - } - } - return toDER(r, s) -} - -function toDER (r, s) { - r = r.toArray() - s = s.toArray() - - // Pad values - if (r[0] & 0x80) r = [ 0 ].concat(r) - if (s[0] & 0x80) s = [ 0 ].concat(s) - - var total = r.length + s.length + 4 - var res = [ 0x30, total, 0x02, r.length ] - res = res.concat(r, [ 0x02, s.length ], s) - return new Buffer(res) -} - -function getKey (x, q, hash, algo) { - x = new Buffer(x.toArray()) - if (x.length < q.byteLength()) { - var zeros = new Buffer(q.byteLength() - x.length) - zeros.fill(0) - x = Buffer.concat([ zeros, x ]) - } - var hlen = hash.length - var hbits = bits2octets(hash, q) - var v = new Buffer(hlen) - v.fill(1) - var k = new Buffer(hlen) - k.fill(0) - k = createHmac(algo, k).update(v).update(new Buffer([ 0 ])).update(x).update(hbits).digest() - v = createHmac(algo, k).update(v).digest() - k = createHmac(algo, k).update(v).update(new Buffer([ 1 ])).update(x).update(hbits).digest() - v = createHmac(algo, k).update(v).digest() - return { k: k, v: v } -} - -function bits2int (obits, q) { - var bits = new BN(obits) - var shift = (obits.length << 3) - q.bitLength() - if (shift > 0) bits.ishrn(shift) - return bits -} - -function bits2octets (bits, q) { - bits = bits2int(bits, q) - bits = bits.mod(q) - var out = new Buffer(bits.toArray()) - if (out.length < q.byteLength()) { - var zeros = new Buffer(q.byteLength() - out.length) - zeros.fill(0) - out = Buffer.concat([ zeros, out ]) - } - return out -} - -function makeKey (q, kv, algo) { - var t - var k - - do { - t = new Buffer(0) - - while (t.length * 8 < q.bitLength()) { - kv.v = createHmac(algo, kv.k).update(kv.v).digest() - t = Buffer.concat([ t, kv.v ]) - } - - k = bits2int(t, q) - kv.k = createHmac(algo, kv.k).update(kv.v).update(new Buffer([ 0 ])).digest() - kv.v = createHmac(algo, kv.k).update(kv.v).digest() - } while (k.cmp(q) !== -1) - - return k -} - -function makeR (g, k, p, q) { - return g.toRed(BN.mont(p)).redPow(k).fromRed().mod(q) -} - -module.exports = sign -module.exports.getKey = getKey -module.exports.makeKey = makeKey - -},{"create-hmac":"Cx6S","browserify-rsa":"Aukv","elliptic":"xha3","bn.js":"BOxy","parse-asn1":"g6E9","./curves.json":"lPVM","buffer":"dskh"}],"pXUL":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -// much of this based on https://github.com/indutny/self-signed/blob/gh-pages/lib/rsa.js -var BN = require('bn.js') -var EC = require('elliptic').ec -var parseKeys = require('parse-asn1') -var curves = require('./curves.json') - -function verify (sig, hash, key, signType, tag) { - var pub = parseKeys(key) - if (pub.type === 'ec') { - // rsa keys can be interpreted as ecdsa ones in openssl - if (signType !== 'ecdsa' && signType !== 'ecdsa/rsa') throw new Error('wrong public key type') - return ecVerify(sig, hash, pub) - } else if (pub.type === 'dsa') { - if (signType !== 'dsa') throw new Error('wrong public key type') - return dsaVerify(sig, hash, pub) - } else { - if (signType !== 'rsa' && signType !== 'ecdsa/rsa') throw new Error('wrong public key type') - } - hash = Buffer.concat([tag, hash]) - var len = pub.modulus.byteLength() - var pad = [ 1 ] - var padNum = 0 - while (hash.length + pad.length + 2 < len) { - pad.push(0xff) - padNum++ - } - pad.push(0x00) - var i = -1 - while (++i < hash.length) { - pad.push(hash[i]) - } - pad = new Buffer(pad) - var red = BN.mont(pub.modulus) - sig = new BN(sig).toRed(red) - - sig = sig.redPow(new BN(pub.publicExponent)) - sig = new Buffer(sig.fromRed().toArray()) - var out = padNum < 8 ? 1 : 0 - len = Math.min(sig.length, pad.length) - if (sig.length !== pad.length) out = 1 - - i = -1 - while (++i < len) out |= sig[i] ^ pad[i] - return out === 0 -} - -function ecVerify (sig, hash, pub) { - var curveId = curves[pub.data.algorithm.curve.join('.')] - if (!curveId) throw new Error('unknown curve ' + pub.data.algorithm.curve.join('.')) - - var curve = new EC(curveId) - var pubkey = pub.data.subjectPrivateKey.data - - return curve.verify(hash, sig, pubkey) -} - -function dsaVerify (sig, hash, pub) { - var p = pub.data.p - var q = pub.data.q - var g = pub.data.g - var y = pub.data.pub_key - var unpacked = parseKeys.signature.decode(sig, 'der') - var s = unpacked.s - var r = unpacked.r - checkValue(s, q) - checkValue(r, q) - var montp = BN.mont(p) - var w = s.invm(q) - var v = g.toRed(montp) - .redPow(new BN(hash).mul(w).mod(q)) - .fromRed() - .mul(y.toRed(montp).redPow(r.mul(w).mod(q)).fromRed()) - .mod(p) - .mod(q) - return v.cmp(r) === 0 -} - -function checkValue (b, q) { - if (b.cmpn(0) <= 0) throw new Error('invalid sig') - if (b.cmp(q) >= q) throw new Error('invalid sig') -} - -module.exports = verify - -},{"bn.js":"BOxy","elliptic":"xha3","parse-asn1":"g6E9","./curves.json":"lPVM","buffer":"dskh"}],"BAbM":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -var createHash = require('create-hash') -var stream = require('stream') -var inherits = require('inherits') -var sign = require('./sign') -var verify = require('./verify') - -var algorithms = require('./algorithms.json') -Object.keys(algorithms).forEach(function (key) { - algorithms[key].id = new Buffer(algorithms[key].id, 'hex') - algorithms[key.toLowerCase()] = algorithms[key] -}) - -function Sign (algorithm) { - stream.Writable.call(this) - - var data = algorithms[algorithm] - if (!data) throw new Error('Unknown message digest') - - this._hashType = data.hash - this._hash = createHash(data.hash) - this._tag = data.id - this._signType = data.sign -} -inherits(Sign, stream.Writable) - -Sign.prototype._write = function _write (data, _, done) { - this._hash.update(data) - done() -} - -Sign.prototype.update = function update (data, enc) { - if (typeof data === 'string') data = new Buffer(data, enc) - - this._hash.update(data) - return this -} - -Sign.prototype.sign = function signMethod (key, enc) { - this.end() - var hash = this._hash.digest() - var sig = sign(hash, key, this._hashType, this._signType, this._tag) - - return enc ? sig.toString(enc) : sig -} - -function Verify (algorithm) { - stream.Writable.call(this) - - var data = algorithms[algorithm] - if (!data) throw new Error('Unknown message digest') - - this._hash = createHash(data.hash) - this._tag = data.id - this._signType = data.sign -} -inherits(Verify, stream.Writable) - -Verify.prototype._write = function _write (data, _, done) { - this._hash.update(data) - done() -} - -Verify.prototype.update = function update (data, enc) { - if (typeof data === 'string') data = new Buffer(data, enc) - - this._hash.update(data) - return this -} - -Verify.prototype.verify = function verifyMethod (key, sig, enc) { - if (typeof sig === 'string') sig = new Buffer(sig, enc) - - this.end() - var hash = this._hash.digest() - return verify(sig, hash, key, this._signType, this._tag) -} - -function createSign (algorithm) { - return new Sign(algorithm) -} - -function createVerify (algorithm) { - return new Verify(algorithm) -} - -module.exports = { - Sign: createSign, - Verify: createVerify, - createSign: createSign, - createVerify: createVerify -} - -},{"create-hash":"LF8r","stream":"fnRj","inherits":"Bm0n","./sign":"oj83","./verify":"pXUL","./algorithms.json":"WoCp","buffer":"dskh"}],"x3tl":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -var elliptic = require('elliptic') -var BN = require('bn.js') - -module.exports = function createECDH (curve) { - return new ECDH(curve) -} - -var aliases = { - secp256k1: { - name: 'secp256k1', - byteLength: 32 - }, - secp224r1: { - name: 'p224', - byteLength: 28 - }, - prime256v1: { - name: 'p256', - byteLength: 32 - }, - prime192v1: { - name: 'p192', - byteLength: 24 - }, - ed25519: { - name: 'ed25519', - byteLength: 32 - }, - secp384r1: { - name: 'p384', - byteLength: 48 - }, - secp521r1: { - name: 'p521', - byteLength: 66 - } -} - -aliases.p224 = aliases.secp224r1 -aliases.p256 = aliases.secp256r1 = aliases.prime256v1 -aliases.p192 = aliases.secp192r1 = aliases.prime192v1 -aliases.p384 = aliases.secp384r1 -aliases.p521 = aliases.secp521r1 - -function ECDH (curve) { - this.curveType = aliases[curve] - if (!this.curveType) { - this.curveType = { - name: curve - } - } - this.curve = new elliptic.ec(this.curveType.name) // eslint-disable-line new-cap - this.keys = void 0 -} - -ECDH.prototype.generateKeys = function (enc, format) { - this.keys = this.curve.genKeyPair() - return this.getPublicKey(enc, format) -} - -ECDH.prototype.computeSecret = function (other, inenc, enc) { - inenc = inenc || 'utf8' - if (!Buffer.isBuffer(other)) { - other = new Buffer(other, inenc) - } - var otherPub = this.curve.keyFromPublic(other).getPublic() - var out = otherPub.mul(this.keys.getPrivate()).getX() - return formatReturnValue(out, enc, this.curveType.byteLength) -} - -ECDH.prototype.getPublicKey = function (enc, format) { - var key = this.keys.getPublic(format === 'compressed', true) - if (format === 'hybrid') { - if (key[key.length - 1] % 2) { - key[0] = 7 - } else { - key[0] = 6 - } - } - return formatReturnValue(key, enc) -} - -ECDH.prototype.getPrivateKey = function (enc) { - return formatReturnValue(this.keys.getPrivate(), enc) -} - -ECDH.prototype.setPublicKey = function (pub, enc) { - enc = enc || 'utf8' - if (!Buffer.isBuffer(pub)) { - pub = new Buffer(pub, enc) - } - this.keys._importPublic(pub) - return this -} - -ECDH.prototype.setPrivateKey = function (priv, enc) { - enc = enc || 'utf8' - if (!Buffer.isBuffer(priv)) { - priv = new Buffer(priv, enc) - } - - var _priv = new BN(priv) - _priv = _priv.toString(16) - this.keys = this.curve.genKeyPair() - this.keys._importPrivate(_priv) - return this -} - -function formatReturnValue (bn, enc, len) { - if (!Array.isArray(bn)) { - bn = bn.toArray() - } - var buf = new Buffer(bn) - if (len && buf.length < len) { - var zeros = new Buffer(len - buf.length) - zeros.fill(0) - buf = Buffer.concat([zeros, buf]) - } - if (!enc) { - return buf - } else { - return buf.toString(enc) - } -} - -},{"elliptic":"xha3","bn.js":"BOxy","buffer":"dskh"}],"QJXH":[function(require,module,exports) { - -var createHash = require('create-hash') -var Buffer = require('safe-buffer').Buffer - -module.exports = function (seed, len) { - var t = Buffer.alloc(0) - var i = 0 - var c - while (t.length < len) { - c = i2ops(i++) - t = Buffer.concat([t, createHash('sha1').update(seed).update(c).digest()]) - } - return t.slice(0, len) -} - -function i2ops (c) { - var out = Buffer.allocUnsafe(4) - out.writeUInt32BE(c, 0) - return out -} - -},{"create-hash":"LF8r","safe-buffer":"Wugr"}],"CItV":[function(require,module,exports) { -module.exports = function xor (a, b) { - var len = a.length - var i = -1 - while (++i < len) { - a[i] ^= b[i] - } - return a -} - -},{}],"kM9E":[function(require,module,exports) { - -var BN = require('bn.js') -var Buffer = require('safe-buffer').Buffer - -function withPublic (paddedMsg, key) { - return Buffer.from(paddedMsg - .toRed(BN.mont(key.modulus)) - .redPow(new BN(key.publicExponent)) - .fromRed() - .toArray()) -} - -module.exports = withPublic - -},{"bn.js":"BOxy","safe-buffer":"Wugr"}],"U4Qp":[function(require,module,exports) { - -var parseKeys = require('parse-asn1') -var randomBytes = require('randombytes') -var createHash = require('create-hash') -var mgf = require('./mgf') -var xor = require('./xor') -var BN = require('bn.js') -var withPublic = require('./withPublic') -var crt = require('browserify-rsa') -var Buffer = require('safe-buffer').Buffer - -module.exports = function publicEncrypt (publicKey, msg, reverse) { - var padding - if (publicKey.padding) { - padding = publicKey.padding - } else if (reverse) { - padding = 1 - } else { - padding = 4 - } - var key = parseKeys(publicKey) - var paddedMsg - if (padding === 4) { - paddedMsg = oaep(key, msg) - } else if (padding === 1) { - paddedMsg = pkcs1(key, msg, reverse) - } else if (padding === 3) { - paddedMsg = new BN(msg) - if (paddedMsg.cmp(key.modulus) >= 0) { - throw new Error('data too long for modulus') - } - } else { - throw new Error('unknown padding') - } - if (reverse) { - return crt(paddedMsg, key) - } else { - return withPublic(paddedMsg, key) - } -} - -function oaep (key, msg) { - var k = key.modulus.byteLength() - var mLen = msg.length - var iHash = createHash('sha1').update(Buffer.alloc(0)).digest() - var hLen = iHash.length - var hLen2 = 2 * hLen - if (mLen > k - hLen2 - 2) { - throw new Error('message too long') - } - var ps = Buffer.alloc(k - mLen - hLen2 - 2) - var dblen = k - hLen - 1 - var seed = randomBytes(hLen) - var maskedDb = xor(Buffer.concat([iHash, ps, Buffer.alloc(1, 1), msg], dblen), mgf(seed, dblen)) - var maskedSeed = xor(seed, mgf(maskedDb, hLen)) - return new BN(Buffer.concat([Buffer.alloc(1), maskedSeed, maskedDb], k)) -} -function pkcs1 (key, msg, reverse) { - var mLen = msg.length - var k = key.modulus.byteLength() - if (mLen > k - 11) { - throw new Error('message too long') - } - var ps - if (reverse) { - ps = Buffer.alloc(k - mLen - 3, 0xff) - } else { - ps = nonZero(k - mLen - 3) - } - return new BN(Buffer.concat([Buffer.from([0, reverse ? 1 : 2]), ps, Buffer.alloc(1), msg], k)) -} -function nonZero (len) { - var out = Buffer.allocUnsafe(len) - var i = 0 - var cache = randomBytes(len * 2) - var cur = 0 - var num - while (i < len) { - if (cur === cache.length) { - cache = randomBytes(len * 2) - cur = 0 - } - num = cache[cur++] - if (num) { - out[i++] = num - } - } - return out -} - -},{"parse-asn1":"g6E9","randombytes":"XJNj","create-hash":"LF8r","./mgf":"QJXH","./xor":"CItV","bn.js":"BOxy","./withPublic":"kM9E","browserify-rsa":"Aukv","safe-buffer":"Wugr"}],"mWkL":[function(require,module,exports) { - -var parseKeys = require('parse-asn1') -var mgf = require('./mgf') -var xor = require('./xor') -var BN = require('bn.js') -var crt = require('browserify-rsa') -var createHash = require('create-hash') -var withPublic = require('./withPublic') -var Buffer = require('safe-buffer').Buffer - -module.exports = function privateDecrypt (privateKey, enc, reverse) { - var padding - if (privateKey.padding) { - padding = privateKey.padding - } else if (reverse) { - padding = 1 - } else { - padding = 4 - } - - var key = parseKeys(privateKey) - var k = key.modulus.byteLength() - if (enc.length > k || new BN(enc).cmp(key.modulus) >= 0) { - throw new Error('decryption error') - } - var msg - if (reverse) { - msg = withPublic(new BN(enc), key) - } else { - msg = crt(enc, key) - } - var zBuffer = Buffer.alloc(k - msg.length) - msg = Buffer.concat([zBuffer, msg], k) - if (padding === 4) { - return oaep(key, msg) - } else if (padding === 1) { - return pkcs1(key, msg, reverse) - } else if (padding === 3) { - return msg - } else { - throw new Error('unknown padding') - } -} - -function oaep (key, msg) { - var k = key.modulus.byteLength() - var iHash = createHash('sha1').update(Buffer.alloc(0)).digest() - var hLen = iHash.length - if (msg[0] !== 0) { - throw new Error('decryption error') - } - var maskedSeed = msg.slice(1, hLen + 1) - var maskedDb = msg.slice(hLen + 1) - var seed = xor(maskedSeed, mgf(maskedDb, hLen)) - var db = xor(maskedDb, mgf(seed, k - hLen - 1)) - if (compare(iHash, db.slice(0, hLen))) { - throw new Error('decryption error') - } - var i = hLen - while (db[i] === 0) { - i++ - } - if (db[i++] !== 1) { - throw new Error('decryption error') - } - return db.slice(i) -} - -function pkcs1 (key, msg, reverse) { - var p1 = msg.slice(0, 2) - var i = 2 - var status = 0 - while (msg[i++] !== 0) { - if (i >= msg.length) { - status++ - break - } - } - var ps = msg.slice(2, i - 1) - - if ((p1.toString('hex') !== '0002' && !reverse) || (p1.toString('hex') !== '0001' && reverse)) { - status++ - } - if (ps.length < 8) { - status++ - } - if (status) { - throw new Error('decryption error') - } - return msg.slice(i) -} -function compare (a, b) { - a = Buffer.from(a) - b = Buffer.from(b) - var dif = 0 - var len = a.length - if (a.length !== b.length) { - dif++ - len = Math.min(a.length, b.length) - } - var i = -1 - while (++i < len) { - dif += (a[i] ^ b[i]) - } - return dif -} - -},{"parse-asn1":"g6E9","./mgf":"QJXH","./xor":"CItV","bn.js":"BOxy","browserify-rsa":"Aukv","create-hash":"LF8r","./withPublic":"kM9E","safe-buffer":"Wugr"}],"WjUF":[function(require,module,exports) { -exports.publicEncrypt = require('./publicEncrypt') -exports.privateDecrypt = require('./privateDecrypt') - -exports.privateEncrypt = function privateEncrypt (key, buf) { - return exports.publicEncrypt(key, buf, true) -} - -exports.publicDecrypt = function publicDecrypt (key, buf) { - return exports.privateDecrypt(key, buf, true) -} - -},{"./publicEncrypt":"U4Qp","./privateDecrypt":"mWkL"}],"ODza":[function(require,module,exports) { - -var global = arguments[3]; -var process = require("process"); -'use strict'; - -function oldBrowser() { - throw new Error('secure random number generation not supported by this browser\nuse chrome, FireFox or Internet Explorer 11'); -} - -var safeBuffer = require('safe-buffer'); - -var randombytes = require('randombytes'); - -var Buffer = safeBuffer.Buffer; -var kBufferMaxLength = safeBuffer.kMaxLength; -var crypto = global.crypto || global.msCrypto; -var kMaxUint32 = Math.pow(2, 32) - 1; - -function assertOffset(offset, length) { - if (typeof offset !== 'number' || offset !== offset) { - // eslint-disable-line no-self-compare - throw new TypeError('offset must be a number'); - } - - if (offset > kMaxUint32 || offset < 0) { - throw new TypeError('offset must be a uint32'); - } - - if (offset > kBufferMaxLength || offset > length) { - throw new RangeError('offset out of range'); - } -} - -function assertSize(size, offset, length) { - if (typeof size !== 'number' || size !== size) { - // eslint-disable-line no-self-compare - throw new TypeError('size must be a number'); - } - - if (size > kMaxUint32 || size < 0) { - throw new TypeError('size must be a uint32'); - } - - if (size + offset > length || size > kBufferMaxLength) { - throw new RangeError('buffer too small'); - } -} - -if (crypto && crypto.getRandomValues || !true) { - exports.randomFill = randomFill; - exports.randomFillSync = randomFillSync; -} else { - exports.randomFill = oldBrowser; - exports.randomFillSync = oldBrowser; -} - -function randomFill(buf, offset, size, cb) { - if (!Buffer.isBuffer(buf) && !(buf instanceof global.Uint8Array)) { - throw new TypeError('"buf" argument must be a Buffer or Uint8Array'); - } - - if (typeof offset === 'function') { - cb = offset; - offset = 0; - size = buf.length; - } else if (typeof size === 'function') { - cb = size; - size = buf.length - offset; - } else if (typeof cb !== 'function') { - throw new TypeError('"cb" argument must be a function'); - } - - assertOffset(offset, buf.length); - assertSize(size, offset, buf.length); - return actualFill(buf, offset, size, cb); -} - -function actualFill(buf, offset, size, cb) { - if (true) { - var ourBuf = buf.buffer; - var uint = new Uint8Array(ourBuf, offset, size); - crypto.getRandomValues(uint); - - if (cb) { - process.nextTick(function () { - cb(null, buf); - }); - return; - } - - return buf; - } - - if (cb) { - randombytes(size, function (err, bytes) { - if (err) { - return cb(err); - } - - bytes.copy(buf, offset); - cb(null, buf); - }); - return; - } - - var bytes = randombytes(size); - bytes.copy(buf, offset); - return buf; -} - -function randomFillSync(buf, offset, size) { - if (typeof offset === 'undefined') { - offset = 0; - } - - if (!Buffer.isBuffer(buf) && !(buf instanceof global.Uint8Array)) { - throw new TypeError('"buf" argument must be a Buffer or Uint8Array'); - } - - assertOffset(offset, buf.length); - if (size === undefined) size = buf.length - offset; - assertSize(size, offset, buf.length); - return actualFill(buf, offset, size); -} -},{"safe-buffer":"Wugr","randombytes":"XJNj","process":"pBGv"}],"mRF4":[function(require,module,exports) { -'use strict' - -exports.randomBytes = exports.rng = exports.pseudoRandomBytes = exports.prng = require('randombytes') -exports.createHash = exports.Hash = require('create-hash') -exports.createHmac = exports.Hmac = require('create-hmac') - -var algos = require('browserify-sign/algos') -var algoKeys = Object.keys(algos) -var hashes = ['sha1', 'sha224', 'sha256', 'sha384', 'sha512', 'md5', 'rmd160'].concat(algoKeys) -exports.getHashes = function () { - return hashes -} - -var p = require('pbkdf2') -exports.pbkdf2 = p.pbkdf2 -exports.pbkdf2Sync = p.pbkdf2Sync - -var aes = require('browserify-cipher') - -exports.Cipher = aes.Cipher -exports.createCipher = aes.createCipher -exports.Cipheriv = aes.Cipheriv -exports.createCipheriv = aes.createCipheriv -exports.Decipher = aes.Decipher -exports.createDecipher = aes.createDecipher -exports.Decipheriv = aes.Decipheriv -exports.createDecipheriv = aes.createDecipheriv -exports.getCiphers = aes.getCiphers -exports.listCiphers = aes.listCiphers - -var dh = require('diffie-hellman') - -exports.DiffieHellmanGroup = dh.DiffieHellmanGroup -exports.createDiffieHellmanGroup = dh.createDiffieHellmanGroup -exports.getDiffieHellman = dh.getDiffieHellman -exports.createDiffieHellman = dh.createDiffieHellman -exports.DiffieHellman = dh.DiffieHellman - -var sign = require('browserify-sign') - -exports.createSign = sign.createSign -exports.Sign = sign.Sign -exports.createVerify = sign.createVerify -exports.Verify = sign.Verify - -exports.createECDH = require('create-ecdh') - -var publicEncrypt = require('public-encrypt') - -exports.publicEncrypt = publicEncrypt.publicEncrypt -exports.privateEncrypt = publicEncrypt.privateEncrypt -exports.publicDecrypt = publicEncrypt.publicDecrypt -exports.privateDecrypt = publicEncrypt.privateDecrypt - -// the least I can do is make error messages for the rest of the node.js/crypto api. -// ;[ -// 'createCredentials' -// ].forEach(function (name) { -// exports[name] = function () { -// throw new Error([ -// 'sorry, ' + name + ' is not implemented yet', -// 'we accept pull requests', -// 'https://github.com/crypto-browserify/crypto-browserify' -// ].join('\n')) -// } -// }) - -var rf = require('randomfill') - -exports.randomFill = rf.randomFill -exports.randomFillSync = rf.randomFillSync - -exports.createCredentials = function () { - throw new Error([ - 'sorry, createCredentials is not implemented yet', - 'we accept pull requests', - 'https://github.com/crypto-browserify/crypto-browserify' - ].join('\n')) -} - -exports.constants = { - 'DH_CHECK_P_NOT_SAFE_PRIME': 2, - 'DH_CHECK_P_NOT_PRIME': 1, - 'DH_UNABLE_TO_CHECK_GENERATOR': 4, - 'DH_NOT_SUITABLE_GENERATOR': 8, - 'NPN_ENABLED': 1, - 'ALPN_ENABLED': 1, - 'RSA_PKCS1_PADDING': 1, - 'RSA_SSLV23_PADDING': 2, - 'RSA_NO_PADDING': 3, - 'RSA_PKCS1_OAEP_PADDING': 4, - 'RSA_X931_PADDING': 5, - 'RSA_PKCS1_PSS_PADDING': 6, - 'POINT_CONVERSION_COMPRESSED': 2, - 'POINT_CONVERSION_UNCOMPRESSED': 4, - 'POINT_CONVERSION_HYBRID': 6 -} - -},{"randombytes":"XJNj","create-hash":"LF8r","create-hmac":"Cx6S","browserify-sign/algos":"YKr5","pbkdf2":"BKdu","browserify-cipher":"KTbn","diffie-hellman":"WFL2","browserify-sign":"BAbM","create-ecdh":"x3tl","public-encrypt":"WjUF","randomfill":"ODza"}],"BhoU":[function(require,module,exports) { -'use strict'; - -const inherits = require('inherits'); - -function Reporter(options) { - this._reporterState = { - obj: null, - path: [], - options: options || {}, - errors: [] - }; -} -exports.Reporter = Reporter; - -Reporter.prototype.isError = function isError(obj) { - return obj instanceof ReporterError; -}; - -Reporter.prototype.save = function save() { - const state = this._reporterState; - - return { obj: state.obj, pathLen: state.path.length }; -}; - -Reporter.prototype.restore = function restore(data) { - const state = this._reporterState; - - state.obj = data.obj; - state.path = state.path.slice(0, data.pathLen); -}; - -Reporter.prototype.enterKey = function enterKey(key) { - return this._reporterState.path.push(key); -}; - -Reporter.prototype.exitKey = function exitKey(index) { - const state = this._reporterState; - - state.path = state.path.slice(0, index - 1); -}; - -Reporter.prototype.leaveKey = function leaveKey(index, key, value) { - const state = this._reporterState; - - this.exitKey(index); - if (state.obj !== null) - state.obj[key] = value; -}; - -Reporter.prototype.path = function path() { - return this._reporterState.path.join('/'); -}; - -Reporter.prototype.enterObject = function enterObject() { - const state = this._reporterState; - - const prev = state.obj; - state.obj = {}; - return prev; -}; - -Reporter.prototype.leaveObject = function leaveObject(prev) { - const state = this._reporterState; - - const now = state.obj; - state.obj = prev; - return now; -}; - -Reporter.prototype.error = function error(msg) { - let err; - const state = this._reporterState; - - const inherited = msg instanceof ReporterError; - if (inherited) { - err = msg; - } else { - err = new ReporterError(state.path.map(function(elem) { - return '[' + JSON.stringify(elem) + ']'; - }).join(''), msg.message || msg, msg.stack); - } - - if (!state.options.partial) - throw err; - - if (!inherited) - state.errors.push(err); - - return err; -}; - -Reporter.prototype.wrapResult = function wrapResult(result) { - const state = this._reporterState; - if (!state.options.partial) - return result; - - return { - result: this.isError(result) ? null : result, - errors: state.errors - }; -}; - -function ReporterError(path, msg) { - this.path = path; - this.rethrow(msg); -} -inherits(ReporterError, Error); - -ReporterError.prototype.rethrow = function rethrow(msg) { - this.message = msg + ' at: ' + (this.path || '(shallow)'); - if (Error.captureStackTrace) - Error.captureStackTrace(this, ReporterError); - - if (!this.stack) { - try { - // IE only adds stack when thrown - throw new Error(this.message); - } catch (e) { - this.stack = e.stack; - } - } - return this; -}; - -},{"inherits":"Bm0n"}],"JJX4":[function(require,module,exports) { - -'use strict'; - -const inherits = require('inherits'); -const Reporter = require('../base/reporter').Reporter; -const Buffer = require('buffer').Buffer; - -function DecoderBuffer(base, options) { - Reporter.call(this, options); - if (!Buffer.isBuffer(base)) { - this.error('Input not Buffer'); - return; - } - - this.base = base; - this.offset = 0; - this.length = base.length; -} -inherits(DecoderBuffer, Reporter); -exports.DecoderBuffer = DecoderBuffer; - -DecoderBuffer.isDecoderBuffer = function isDecoderBuffer(data) { - if (data instanceof DecoderBuffer) { - return true; - } - - // Or accept compatible API - const isCompatible = typeof data === 'object' && - Buffer.isBuffer(data.base) && - data.constructor.name === 'DecoderBuffer' && - typeof data.offset === 'number' && - typeof data.length === 'number' && - typeof data.save === 'function' && - typeof data.restore === 'function' && - typeof data.isEmpty === 'function' && - typeof data.readUInt8 === 'function' && - typeof data.skip === 'function' && - typeof data.raw === 'function'; - - return isCompatible; -}; - -DecoderBuffer.prototype.save = function save() { - return { offset: this.offset, reporter: Reporter.prototype.save.call(this) }; -}; - -DecoderBuffer.prototype.restore = function restore(save) { - // Return skipped data - const res = new DecoderBuffer(this.base); - res.offset = save.offset; - res.length = this.offset; - - this.offset = save.offset; - Reporter.prototype.restore.call(this, save.reporter); - - return res; -}; - -DecoderBuffer.prototype.isEmpty = function isEmpty() { - return this.offset === this.length; -}; - -DecoderBuffer.prototype.readUInt8 = function readUInt8(fail) { - if (this.offset + 1 <= this.length) - return this.base.readUInt8(this.offset++, true); - else - return this.error(fail || 'DecoderBuffer overrun'); -}; - -DecoderBuffer.prototype.skip = function skip(bytes, fail) { - if (!(this.offset + bytes <= this.length)) - return this.error(fail || 'DecoderBuffer overrun'); - - const res = new DecoderBuffer(this.base); - - // Share reporter state - res._reporterState = this._reporterState; - - res.offset = this.offset; - res.length = this.offset + bytes; - this.offset += bytes; - return res; -}; - -DecoderBuffer.prototype.raw = function raw(save) { - return this.base.slice(save ? save.offset : this.offset, this.length); -}; - -function EncoderBuffer(value, reporter) { - if (Array.isArray(value)) { - this.length = 0; - this.value = value.map(function(item) { - if (!EncoderBuffer.isEncoderBuffer(item)) - item = new EncoderBuffer(item, reporter); - this.length += item.length; - return item; - }, this); - } else if (typeof value === 'number') { - if (!(0 <= value && value <= 0xff)) - return reporter.error('non-byte EncoderBuffer value'); - this.value = value; - this.length = 1; - } else if (typeof value === 'string') { - this.value = value; - this.length = Buffer.byteLength(value); - } else if (Buffer.isBuffer(value)) { - this.value = value; - this.length = value.length; - } else { - return reporter.error('Unsupported type: ' + typeof value); - } -} -exports.EncoderBuffer = EncoderBuffer; - -EncoderBuffer.isEncoderBuffer = function isEncoderBuffer(data) { - if (data instanceof EncoderBuffer) { - return true; - } - - // Or accept compatible API - const isCompatible = typeof data === 'object' && - data.constructor.name === 'EncoderBuffer' && - typeof data.length === 'number' && - typeof data.join === 'function'; - - return isCompatible; -}; - -EncoderBuffer.prototype.join = function join(out, offset) { - if (!out) - out = new Buffer(this.length); - if (!offset) - offset = 0; - - if (this.length === 0) - return out; - - if (Array.isArray(this.value)) { - this.value.forEach(function(item) { - item.join(out, offset); - offset += item.length; - }); - } else { - if (typeof this.value === 'number') - out[offset] = this.value; - else if (typeof this.value === 'string') - out.write(this.value, offset); - else if (Buffer.isBuffer(this.value)) - this.value.copy(out, offset); - offset += this.length; - } - - return out; -}; - -},{"inherits":"Bm0n","../base/reporter":"BhoU","buffer":"dskh"}],"kZXB":[function(require,module,exports) { -'use strict'; - -const Reporter = require('../base/reporter').Reporter; -const EncoderBuffer = require('../base/buffer').EncoderBuffer; -const DecoderBuffer = require('../base/buffer').DecoderBuffer; -const assert = require('minimalistic-assert'); - -// Supported tags -const tags = [ - 'seq', 'seqof', 'set', 'setof', 'objid', 'bool', - 'gentime', 'utctime', 'null_', 'enum', 'int', 'objDesc', - 'bitstr', 'bmpstr', 'charstr', 'genstr', 'graphstr', 'ia5str', 'iso646str', - 'numstr', 'octstr', 'printstr', 't61str', 'unistr', 'utf8str', 'videostr' -]; - -// Public methods list -const methods = [ - 'key', 'obj', 'use', 'optional', 'explicit', 'implicit', 'def', 'choice', - 'any', 'contains' -].concat(tags); - -// Overrided methods list -const overrided = [ - '_peekTag', '_decodeTag', '_use', - '_decodeStr', '_decodeObjid', '_decodeTime', - '_decodeNull', '_decodeInt', '_decodeBool', '_decodeList', - - '_encodeComposite', '_encodeStr', '_encodeObjid', '_encodeTime', - '_encodeNull', '_encodeInt', '_encodeBool' -]; - -function Node(enc, parent, name) { - const state = {}; - this._baseState = state; - - state.name = name; - state.enc = enc; - - state.parent = parent || null; - state.children = null; - - // State - state.tag = null; - state.args = null; - state.reverseArgs = null; - state.choice = null; - state.optional = false; - state.any = false; - state.obj = false; - state.use = null; - state.useDecoder = null; - state.key = null; - state['default'] = null; - state.explicit = null; - state.implicit = null; - state.contains = null; - - // Should create new instance on each method - if (!state.parent) { - state.children = []; - this._wrap(); - } -} -module.exports = Node; - -const stateProps = [ - 'enc', 'parent', 'children', 'tag', 'args', 'reverseArgs', 'choice', - 'optional', 'any', 'obj', 'use', 'alteredUse', 'key', 'default', 'explicit', - 'implicit', 'contains' -]; - -Node.prototype.clone = function clone() { - const state = this._baseState; - const cstate = {}; - stateProps.forEach(function(prop) { - cstate[prop] = state[prop]; - }); - const res = new this.constructor(cstate.parent); - res._baseState = cstate; - return res; -}; - -Node.prototype._wrap = function wrap() { - const state = this._baseState; - methods.forEach(function(method) { - this[method] = function _wrappedMethod() { - const clone = new this.constructor(this); - state.children.push(clone); - return clone[method].apply(clone, arguments); - }; - }, this); -}; - -Node.prototype._init = function init(body) { - const state = this._baseState; - - assert(state.parent === null); - body.call(this); - - // Filter children - state.children = state.children.filter(function(child) { - return child._baseState.parent === this; - }, this); - assert.equal(state.children.length, 1, 'Root node can have only one child'); -}; - -Node.prototype._useArgs = function useArgs(args) { - const state = this._baseState; - - // Filter children and args - const children = args.filter(function(arg) { - return arg instanceof this.constructor; - }, this); - args = args.filter(function(arg) { - return !(arg instanceof this.constructor); - }, this); - - if (children.length !== 0) { - assert(state.children === null); - state.children = children; - - // Replace parent to maintain backward link - children.forEach(function(child) { - child._baseState.parent = this; - }, this); - } - if (args.length !== 0) { - assert(state.args === null); - state.args = args; - state.reverseArgs = args.map(function(arg) { - if (typeof arg !== 'object' || arg.constructor !== Object) - return arg; - - const res = {}; - Object.keys(arg).forEach(function(key) { - if (key == (key | 0)) - key |= 0; - const value = arg[key]; - res[value] = key; - }); - return res; - }); - } -}; - -// -// Overrided methods -// - -overrided.forEach(function(method) { - Node.prototype[method] = function _overrided() { - const state = this._baseState; - throw new Error(method + ' not implemented for encoding: ' + state.enc); - }; -}); - -// -// Public methods -// - -tags.forEach(function(tag) { - Node.prototype[tag] = function _tagMethod() { - const state = this._baseState; - const args = Array.prototype.slice.call(arguments); - - assert(state.tag === null); - state.tag = tag; - - this._useArgs(args); - - return this; - }; -}); - -Node.prototype.use = function use(item) { - assert(item); - const state = this._baseState; - - assert(state.use === null); - state.use = item; - - return this; -}; - -Node.prototype.optional = function optional() { - const state = this._baseState; - - state.optional = true; - - return this; -}; - -Node.prototype.def = function def(val) { - const state = this._baseState; - - assert(state['default'] === null); - state['default'] = val; - state.optional = true; - - return this; -}; - -Node.prototype.explicit = function explicit(num) { - const state = this._baseState; - - assert(state.explicit === null && state.implicit === null); - state.explicit = num; - - return this; -}; - -Node.prototype.implicit = function implicit(num) { - const state = this._baseState; - - assert(state.explicit === null && state.implicit === null); - state.implicit = num; - - return this; -}; - -Node.prototype.obj = function obj() { - const state = this._baseState; - const args = Array.prototype.slice.call(arguments); - - state.obj = true; - - if (args.length !== 0) - this._useArgs(args); - - return this; -}; - -Node.prototype.key = function key(newKey) { - const state = this._baseState; - - assert(state.key === null); - state.key = newKey; - - return this; -}; - -Node.prototype.any = function any() { - const state = this._baseState; - - state.any = true; - - return this; -}; - -Node.prototype.choice = function choice(obj) { - const state = this._baseState; - - assert(state.choice === null); - state.choice = obj; - this._useArgs(Object.keys(obj).map(function(key) { - return obj[key]; - })); - - return this; -}; - -Node.prototype.contains = function contains(item) { - const state = this._baseState; - - assert(state.use === null); - state.contains = item; - - return this; -}; - -// -// Decoding -// - -Node.prototype._decode = function decode(input, options) { - const state = this._baseState; - - // Decode root node - if (state.parent === null) - return input.wrapResult(state.children[0]._decode(input, options)); - - let result = state['default']; - let present = true; - - let prevKey = null; - if (state.key !== null) - prevKey = input.enterKey(state.key); - - // Check if tag is there - if (state.optional) { - let tag = null; - if (state.explicit !== null) - tag = state.explicit; - else if (state.implicit !== null) - tag = state.implicit; - else if (state.tag !== null) - tag = state.tag; - - if (tag === null && !state.any) { - // Trial and Error - const save = input.save(); - try { - if (state.choice === null) - this._decodeGeneric(state.tag, input, options); - else - this._decodeChoice(input, options); - present = true; - } catch (e) { - present = false; - } - input.restore(save); - } else { - present = this._peekTag(input, tag, state.any); - - if (input.isError(present)) - return present; - } - } - - // Push object on stack - let prevObj; - if (state.obj && present) - prevObj = input.enterObject(); - - if (present) { - // Unwrap explicit values - if (state.explicit !== null) { - const explicit = this._decodeTag(input, state.explicit); - if (input.isError(explicit)) - return explicit; - input = explicit; - } - - const start = input.offset; - - // Unwrap implicit and normal values - if (state.use === null && state.choice === null) { - let save; - if (state.any) - save = input.save(); - const body = this._decodeTag( - input, - state.implicit !== null ? state.implicit : state.tag, - state.any - ); - if (input.isError(body)) - return body; - - if (state.any) - result = input.raw(save); - else - input = body; - } - - if (options && options.track && state.tag !== null) - options.track(input.path(), start, input.length, 'tagged'); - - if (options && options.track && state.tag !== null) - options.track(input.path(), input.offset, input.length, 'content'); - - // Select proper method for tag - if (state.any) { - // no-op - } else if (state.choice === null) { - result = this._decodeGeneric(state.tag, input, options); - } else { - result = this._decodeChoice(input, options); - } - - if (input.isError(result)) - return result; - - // Decode children - if (!state.any && state.choice === null && state.children !== null) { - state.children.forEach(function decodeChildren(child) { - // NOTE: We are ignoring errors here, to let parser continue with other - // parts of encoded data - child._decode(input, options); - }); - } - - // Decode contained/encoded by schema, only in bit or octet strings - if (state.contains && (state.tag === 'octstr' || state.tag === 'bitstr')) { - const data = new DecoderBuffer(result); - result = this._getUse(state.contains, input._reporterState.obj) - ._decode(data, options); - } - } - - // Pop object - if (state.obj && present) - result = input.leaveObject(prevObj); - - // Set key - if (state.key !== null && (result !== null || present === true)) - input.leaveKey(prevKey, state.key, result); - else if (prevKey !== null) - input.exitKey(prevKey); - - return result; -}; - -Node.prototype._decodeGeneric = function decodeGeneric(tag, input, options) { - const state = this._baseState; - - if (tag === 'seq' || tag === 'set') - return null; - if (tag === 'seqof' || tag === 'setof') - return this._decodeList(input, tag, state.args[0], options); - else if (/str$/.test(tag)) - return this._decodeStr(input, tag, options); - else if (tag === 'objid' && state.args) - return this._decodeObjid(input, state.args[0], state.args[1], options); - else if (tag === 'objid') - return this._decodeObjid(input, null, null, options); - else if (tag === 'gentime' || tag === 'utctime') - return this._decodeTime(input, tag, options); - else if (tag === 'null_') - return this._decodeNull(input, options); - else if (tag === 'bool') - return this._decodeBool(input, options); - else if (tag === 'objDesc') - return this._decodeStr(input, tag, options); - else if (tag === 'int' || tag === 'enum') - return this._decodeInt(input, state.args && state.args[0], options); - - if (state.use !== null) { - return this._getUse(state.use, input._reporterState.obj) - ._decode(input, options); - } else { - return input.error('unknown tag: ' + tag); - } -}; - -Node.prototype._getUse = function _getUse(entity, obj) { - - const state = this._baseState; - // Create altered use decoder if implicit is set - state.useDecoder = this._use(entity, obj); - assert(state.useDecoder._baseState.parent === null); - state.useDecoder = state.useDecoder._baseState.children[0]; - if (state.implicit !== state.useDecoder._baseState.implicit) { - state.useDecoder = state.useDecoder.clone(); - state.useDecoder._baseState.implicit = state.implicit; - } - return state.useDecoder; -}; - -Node.prototype._decodeChoice = function decodeChoice(input, options) { - const state = this._baseState; - let result = null; - let match = false; - - Object.keys(state.choice).some(function(key) { - const save = input.save(); - const node = state.choice[key]; - try { - const value = node._decode(input, options); - if (input.isError(value)) - return false; - - result = { type: key, value: value }; - match = true; - } catch (e) { - input.restore(save); - return false; - } - return true; - }, this); - - if (!match) - return input.error('Choice not matched'); - - return result; -}; - -// -// Encoding -// - -Node.prototype._createEncoderBuffer = function createEncoderBuffer(data) { - return new EncoderBuffer(data, this.reporter); -}; - -Node.prototype._encode = function encode(data, reporter, parent) { - const state = this._baseState; - if (state['default'] !== null && state['default'] === data) - return; - - const result = this._encodeValue(data, reporter, parent); - if (result === undefined) - return; - - if (this._skipDefault(result, reporter, parent)) - return; - - return result; -}; - -Node.prototype._encodeValue = function encode(data, reporter, parent) { - const state = this._baseState; - - // Decode root node - if (state.parent === null) - return state.children[0]._encode(data, reporter || new Reporter()); - - let result = null; - - // Set reporter to share it with a child class - this.reporter = reporter; - - // Check if data is there - if (state.optional && data === undefined) { - if (state['default'] !== null) - data = state['default']; - else - return; - } - - // Encode children first - let content = null; - let primitive = false; - if (state.any) { - // Anything that was given is translated to buffer - result = this._createEncoderBuffer(data); - } else if (state.choice) { - result = this._encodeChoice(data, reporter); - } else if (state.contains) { - content = this._getUse(state.contains, parent)._encode(data, reporter); - primitive = true; - } else if (state.children) { - content = state.children.map(function(child) { - if (child._baseState.tag === 'null_') - return child._encode(null, reporter, data); - - if (child._baseState.key === null) - return reporter.error('Child should have a key'); - const prevKey = reporter.enterKey(child._baseState.key); - - if (typeof data !== 'object') - return reporter.error('Child expected, but input is not object'); - - const res = child._encode(data[child._baseState.key], reporter, data); - reporter.leaveKey(prevKey); - - return res; - }, this).filter(function(child) { - return child; - }); - content = this._createEncoderBuffer(content); - } else { - if (state.tag === 'seqof' || state.tag === 'setof') { - // TODO(indutny): this should be thrown on DSL level - if (!(state.args && state.args.length === 1)) - return reporter.error('Too many args for : ' + state.tag); - - if (!Array.isArray(data)) - return reporter.error('seqof/setof, but data is not Array'); - - const child = this.clone(); - child._baseState.implicit = null; - content = this._createEncoderBuffer(data.map(function(item) { - const state = this._baseState; - - return this._getUse(state.args[0], data)._encode(item, reporter); - }, child)); - } else if (state.use !== null) { - result = this._getUse(state.use, parent)._encode(data, reporter); - } else { - content = this._encodePrimitive(state.tag, data); - primitive = true; - } - } - - // Encode data itself - if (!state.any && state.choice === null) { - const tag = state.implicit !== null ? state.implicit : state.tag; - const cls = state.implicit === null ? 'universal' : 'context'; - - if (tag === null) { - if (state.use === null) - reporter.error('Tag could be omitted only for .use()'); - } else { - if (state.use === null) - result = this._encodeComposite(tag, primitive, cls, content); - } - } - - // Wrap in explicit - if (state.explicit !== null) - result = this._encodeComposite(state.explicit, false, 'context', result); - - return result; -}; - -Node.prototype._encodeChoice = function encodeChoice(data, reporter) { - const state = this._baseState; - - const node = state.choice[data.type]; - if (!node) { - assert( - false, - data.type + ' not found in ' + - JSON.stringify(Object.keys(state.choice))); - } - return node._encode(data.value, reporter); -}; - -Node.prototype._encodePrimitive = function encodePrimitive(tag, data) { - const state = this._baseState; - - if (/str$/.test(tag)) - return this._encodeStr(data, tag); - else if (tag === 'objid' && state.args) - return this._encodeObjid(data, state.reverseArgs[0], state.args[1]); - else if (tag === 'objid') - return this._encodeObjid(data, null, null); - else if (tag === 'gentime' || tag === 'utctime') - return this._encodeTime(data, tag); - else if (tag === 'null_') - return this._encodeNull(); - else if (tag === 'int' || tag === 'enum') - return this._encodeInt(data, state.args && state.reverseArgs[0]); - else if (tag === 'bool') - return this._encodeBool(data); - else if (tag === 'objDesc') - return this._encodeStr(data, tag); - else - throw new Error('Unsupported tag: ' + tag); -}; - -Node.prototype._isNumstr = function isNumstr(str) { - return /^[0-9 ]*$/.test(str); -}; - -Node.prototype._isPrintstr = function isPrintstr(str) { - return /^[A-Za-z0-9 '()+,-./:=?]*$/.test(str); -}; - -},{"../base/reporter":"BhoU","../base/buffer":"JJX4","minimalistic-assert":"MpuC"}],"psPF":[function(require,module,exports) { -'use strict'; - -// Helper -function reverse(map) { - const res = {}; - - Object.keys(map).forEach(function(key) { - // Convert key to integer if it is stringified - if ((key | 0) == key) - key = key | 0; - - const value = map[key]; - res[value] = key; - }); - - return res; -} - -exports.tagClass = { - 0: 'universal', - 1: 'application', - 2: 'context', - 3: 'private' -}; -exports.tagClassByName = reverse(exports.tagClass); - -exports.tag = { - 0x00: 'end', - 0x01: 'bool', - 0x02: 'int', - 0x03: 'bitstr', - 0x04: 'octstr', - 0x05: 'null_', - 0x06: 'objid', - 0x07: 'objDesc', - 0x08: 'external', - 0x09: 'real', - 0x0a: 'enum', - 0x0b: 'embed', - 0x0c: 'utf8str', - 0x0d: 'relativeOid', - 0x10: 'seq', - 0x11: 'set', - 0x12: 'numstr', - 0x13: 'printstr', - 0x14: 't61str', - 0x15: 'videostr', - 0x16: 'ia5str', - 0x17: 'utctime', - 0x18: 'gentime', - 0x19: 'graphstr', - 0x1a: 'iso646str', - 0x1b: 'genstr', - 0x1c: 'unistr', - 0x1d: 'charstr', - 0x1e: 'bmpstr' -}; -exports.tagByName = reverse(exports.tag); - -},{}],"adTp":[function(require,module,exports) { - -'use strict'; - -const inherits = require('inherits'); -const Buffer = require('buffer').Buffer; -const Node = require('../base/node'); - -// Import DER constants -const der = require('../constants/der'); - -function DEREncoder(entity) { - this.enc = 'der'; - this.name = entity.name; - this.entity = entity; - - // Construct base tree - this.tree = new DERNode(); - this.tree._init(entity.body); -} -module.exports = DEREncoder; - -DEREncoder.prototype.encode = function encode(data, reporter) { - return this.tree._encode(data, reporter).join(); -}; - -// Tree methods - -function DERNode(parent) { - Node.call(this, 'der', parent); -} -inherits(DERNode, Node); - -DERNode.prototype._encodeComposite = function encodeComposite(tag, - primitive, - cls, - content) { - const encodedTag = encodeTag(tag, primitive, cls, this.reporter); - - // Short form - if (content.length < 0x80) { - const header = new Buffer(2); - header[0] = encodedTag; - header[1] = content.length; - return this._createEncoderBuffer([ header, content ]); - } - - // Long form - // Count octets required to store length - let lenOctets = 1; - for (let i = content.length; i >= 0x100; i >>= 8) - lenOctets++; - - const header = new Buffer(1 + 1 + lenOctets); - header[0] = encodedTag; - header[1] = 0x80 | lenOctets; - - for (let i = 1 + lenOctets, j = content.length; j > 0; i--, j >>= 8) - header[i] = j & 0xff; - - return this._createEncoderBuffer([ header, content ]); -}; - -DERNode.prototype._encodeStr = function encodeStr(str, tag) { - if (tag === 'bitstr') { - return this._createEncoderBuffer([ str.unused | 0, str.data ]); - } else if (tag === 'bmpstr') { - const buf = new Buffer(str.length * 2); - for (let i = 0; i < str.length; i++) { - buf.writeUInt16BE(str.charCodeAt(i), i * 2); - } - return this._createEncoderBuffer(buf); - } else if (tag === 'numstr') { - if (!this._isNumstr(str)) { - return this.reporter.error('Encoding of string type: numstr supports ' + - 'only digits and space'); - } - return this._createEncoderBuffer(str); - } else if (tag === 'printstr') { - if (!this._isPrintstr(str)) { - return this.reporter.error('Encoding of string type: printstr supports ' + - 'only latin upper and lower case letters, ' + - 'digits, space, apostrophe, left and rigth ' + - 'parenthesis, plus sign, comma, hyphen, ' + - 'dot, slash, colon, equal sign, ' + - 'question mark'); - } - return this._createEncoderBuffer(str); - } else if (/str$/.test(tag)) { - return this._createEncoderBuffer(str); - } else if (tag === 'objDesc') { - return this._createEncoderBuffer(str); - } else { - return this.reporter.error('Encoding of string type: ' + tag + - ' unsupported'); - } -}; - -DERNode.prototype._encodeObjid = function encodeObjid(id, values, relative) { - if (typeof id === 'string') { - if (!values) - return this.reporter.error('string objid given, but no values map found'); - if (!values.hasOwnProperty(id)) - return this.reporter.error('objid not found in values map'); - id = values[id].split(/[\s.]+/g); - for (let i = 0; i < id.length; i++) - id[i] |= 0; - } else if (Array.isArray(id)) { - id = id.slice(); - for (let i = 0; i < id.length; i++) - id[i] |= 0; - } - - if (!Array.isArray(id)) { - return this.reporter.error('objid() should be either array or string, ' + - 'got: ' + JSON.stringify(id)); - } - - if (!relative) { - if (id[1] >= 40) - return this.reporter.error('Second objid identifier OOB'); - id.splice(0, 2, id[0] * 40 + id[1]); - } - - // Count number of octets - let size = 0; - for (let i = 0; i < id.length; i++) { - let ident = id[i]; - for (size++; ident >= 0x80; ident >>= 7) - size++; - } - - const objid = new Buffer(size); - let offset = objid.length - 1; - for (let i = id.length - 1; i >= 0; i--) { - let ident = id[i]; - objid[offset--] = ident & 0x7f; - while ((ident >>= 7) > 0) - objid[offset--] = 0x80 | (ident & 0x7f); - } - - return this._createEncoderBuffer(objid); -}; - -function two(num) { - if (num < 10) - return '0' + num; - else - return num; -} - -DERNode.prototype._encodeTime = function encodeTime(time, tag) { - let str; - const date = new Date(time); - - if (tag === 'gentime') { - str = [ - two(date.getUTCFullYear()), - two(date.getUTCMonth() + 1), - two(date.getUTCDate()), - two(date.getUTCHours()), - two(date.getUTCMinutes()), - two(date.getUTCSeconds()), - 'Z' - ].join(''); - } else if (tag === 'utctime') { - str = [ - two(date.getUTCFullYear() % 100), - two(date.getUTCMonth() + 1), - two(date.getUTCDate()), - two(date.getUTCHours()), - two(date.getUTCMinutes()), - two(date.getUTCSeconds()), - 'Z' - ].join(''); - } else { - this.reporter.error('Encoding ' + tag + ' time is not supported yet'); - } - - return this._encodeStr(str, 'octstr'); -}; - -DERNode.prototype._encodeNull = function encodeNull() { - return this._createEncoderBuffer(''); -}; - -DERNode.prototype._encodeInt = function encodeInt(num, values) { - if (typeof num === 'string') { - if (!values) - return this.reporter.error('String int or enum given, but no values map'); - if (!values.hasOwnProperty(num)) { - return this.reporter.error('Values map doesn\'t contain: ' + - JSON.stringify(num)); - } - num = values[num]; - } - - // Bignum, assume big endian - if (typeof num !== 'number' && !Buffer.isBuffer(num)) { - const numArray = num.toArray(); - if (!num.sign && numArray[0] & 0x80) { - numArray.unshift(0); - } - num = new Buffer(numArray); - } - - if (Buffer.isBuffer(num)) { - let size = num.length; - if (num.length === 0) - size++; - - const out = new Buffer(size); - num.copy(out); - if (num.length === 0) - out[0] = 0; - return this._createEncoderBuffer(out); - } - - if (num < 0x80) - return this._createEncoderBuffer(num); - - if (num < 0x100) - return this._createEncoderBuffer([0, num]); - - let size = 1; - for (let i = num; i >= 0x100; i >>= 8) - size++; - - const out = new Array(size); - for (let i = out.length - 1; i >= 0; i--) { - out[i] = num & 0xff; - num >>= 8; - } - if(out[0] & 0x80) { - out.unshift(0); - } - - return this._createEncoderBuffer(new Buffer(out)); -}; - -DERNode.prototype._encodeBool = function encodeBool(value) { - return this._createEncoderBuffer(value ? 0xff : 0); -}; - -DERNode.prototype._use = function use(entity, obj) { - if (typeof entity === 'function') - entity = entity(obj); - return entity._getEncoder('der').tree; -}; - -DERNode.prototype._skipDefault = function skipDefault(dataBuffer, reporter, parent) { - const state = this._baseState; - let i; - if (state['default'] === null) - return false; - - const data = dataBuffer.join(); - if (state.defaultBuffer === undefined) - state.defaultBuffer = this._encodeValue(state['default'], reporter, parent).join(); - - if (data.length !== state.defaultBuffer.length) - return false; - - for (i=0; i < data.length; i++) - if (data[i] !== state.defaultBuffer[i]) - return false; - - return true; -}; - -// Utility methods - -function encodeTag(tag, primitive, cls, reporter) { - let res; - - if (tag === 'seqof') - tag = 'seq'; - else if (tag === 'setof') - tag = 'set'; - - if (der.tagByName.hasOwnProperty(tag)) - res = der.tagByName[tag]; - else if (typeof tag === 'number' && (tag | 0) === tag) - res = tag; - else - return reporter.error('Unknown tag: ' + tag); - - if (res >= 0x1f) - return reporter.error('Multi-octet tag encoding unsupported'); - - if (!primitive) - res |= 0x20; - - res |= (der.tagClassByName[cls || 'universal'] << 6); - - return res; -} - -},{"inherits":"Bm0n","buffer":"dskh","../base/node":"kZXB","../constants/der":"psPF"}],"Yqnf":[function(require,module,exports) { -'use strict'; - -const inherits = require('inherits'); - -const DEREncoder = require('./der'); - -function PEMEncoder(entity) { - DEREncoder.call(this, entity); - this.enc = 'pem'; -} -inherits(PEMEncoder, DEREncoder); -module.exports = PEMEncoder; - -PEMEncoder.prototype.encode = function encode(data, options) { - const buf = DEREncoder.prototype.encode.call(this, data); - - const p = buf.toString('base64'); - const out = [ '-----BEGIN ' + options.label + '-----' ]; - for (let i = 0; i < p.length; i += 64) - out.push(p.slice(i, i + 64)); - out.push('-----END ' + options.label + '-----'); - return out.join('\n'); -}; - -},{"inherits":"Bm0n","./der":"adTp"}],"YGCS":[function(require,module,exports) { -'use strict'; - -const encoders = exports; - -encoders.der = require('./der'); -encoders.pem = require('./pem'); - -},{"./der":"adTp","./pem":"Yqnf"}],"Hd0I":[function(require,module,exports) { -'use strict'; - -const inherits = require('inherits'); - -const bignum = require('bn.js'); -const DecoderBuffer = require('../base/buffer').DecoderBuffer; -const Node = require('../base/node'); - -// Import DER constants -const der = require('../constants/der'); - -function DERDecoder(entity) { - this.enc = 'der'; - this.name = entity.name; - this.entity = entity; - - // Construct base tree - this.tree = new DERNode(); - this.tree._init(entity.body); -} -module.exports = DERDecoder; - -DERDecoder.prototype.decode = function decode(data, options) { - if (!DecoderBuffer.isDecoderBuffer(data)) { - data = new DecoderBuffer(data, options); - } - - return this.tree._decode(data, options); -}; - -// Tree methods - -function DERNode(parent) { - Node.call(this, 'der', parent); -} -inherits(DERNode, Node); - -DERNode.prototype._peekTag = function peekTag(buffer, tag, any) { - if (buffer.isEmpty()) - return false; - - const state = buffer.save(); - const decodedTag = derDecodeTag(buffer, 'Failed to peek tag: "' + tag + '"'); - if (buffer.isError(decodedTag)) - return decodedTag; - - buffer.restore(state); - - return decodedTag.tag === tag || decodedTag.tagStr === tag || - (decodedTag.tagStr + 'of') === tag || any; -}; - -DERNode.prototype._decodeTag = function decodeTag(buffer, tag, any) { - const decodedTag = derDecodeTag(buffer, - 'Failed to decode tag of "' + tag + '"'); - if (buffer.isError(decodedTag)) - return decodedTag; - - let len = derDecodeLen(buffer, - decodedTag.primitive, - 'Failed to get length of "' + tag + '"'); - - // Failure - if (buffer.isError(len)) - return len; - - if (!any && - decodedTag.tag !== tag && - decodedTag.tagStr !== tag && - decodedTag.tagStr + 'of' !== tag) { - return buffer.error('Failed to match tag: "' + tag + '"'); - } - - if (decodedTag.primitive || len !== null) - return buffer.skip(len, 'Failed to match body of: "' + tag + '"'); - - // Indefinite length... find END tag - const state = buffer.save(); - const res = this._skipUntilEnd( - buffer, - 'Failed to skip indefinite length body: "' + this.tag + '"'); - if (buffer.isError(res)) - return res; - - len = buffer.offset - state.offset; - buffer.restore(state); - return buffer.skip(len, 'Failed to match body of: "' + tag + '"'); -}; - -DERNode.prototype._skipUntilEnd = function skipUntilEnd(buffer, fail) { - for (;;) { - const tag = derDecodeTag(buffer, fail); - if (buffer.isError(tag)) - return tag; - const len = derDecodeLen(buffer, tag.primitive, fail); - if (buffer.isError(len)) - return len; - - let res; - if (tag.primitive || len !== null) - res = buffer.skip(len); - else - res = this._skipUntilEnd(buffer, fail); - - // Failure - if (buffer.isError(res)) - return res; - - if (tag.tagStr === 'end') - break; - } -}; - -DERNode.prototype._decodeList = function decodeList(buffer, tag, decoder, - options) { - const result = []; - while (!buffer.isEmpty()) { - const possibleEnd = this._peekTag(buffer, 'end'); - if (buffer.isError(possibleEnd)) - return possibleEnd; - - const res = decoder.decode(buffer, 'der', options); - if (buffer.isError(res) && possibleEnd) - break; - result.push(res); - } - return result; -}; - -DERNode.prototype._decodeStr = function decodeStr(buffer, tag) { - if (tag === 'bitstr') { - const unused = buffer.readUInt8(); - if (buffer.isError(unused)) - return unused; - return { unused: unused, data: buffer.raw() }; - } else if (tag === 'bmpstr') { - const raw = buffer.raw(); - if (raw.length % 2 === 1) - return buffer.error('Decoding of string type: bmpstr length mismatch'); - - let str = ''; - for (let i = 0; i < raw.length / 2; i++) { - str += String.fromCharCode(raw.readUInt16BE(i * 2)); - } - return str; - } else if (tag === 'numstr') { - const numstr = buffer.raw().toString('ascii'); - if (!this._isNumstr(numstr)) { - return buffer.error('Decoding of string type: ' + - 'numstr unsupported characters'); - } - return numstr; - } else if (tag === 'octstr') { - return buffer.raw(); - } else if (tag === 'objDesc') { - return buffer.raw(); - } else if (tag === 'printstr') { - const printstr = buffer.raw().toString('ascii'); - if (!this._isPrintstr(printstr)) { - return buffer.error('Decoding of string type: ' + - 'printstr unsupported characters'); - } - return printstr; - } else if (/str$/.test(tag)) { - return buffer.raw().toString(); - } else { - return buffer.error('Decoding of string type: ' + tag + ' unsupported'); - } -}; - -DERNode.prototype._decodeObjid = function decodeObjid(buffer, values, relative) { - let result; - const identifiers = []; - let ident = 0; - let subident = 0; - while (!buffer.isEmpty()) { - subident = buffer.readUInt8(); - ident <<= 7; - ident |= subident & 0x7f; - if ((subident & 0x80) === 0) { - identifiers.push(ident); - ident = 0; - } - } - if (subident & 0x80) - identifiers.push(ident); - - const first = (identifiers[0] / 40) | 0; - const second = identifiers[0] % 40; - - if (relative) - result = identifiers; - else - result = [first, second].concat(identifiers.slice(1)); - - if (values) { - let tmp = values[result.join(' ')]; - if (tmp === undefined) - tmp = values[result.join('.')]; - if (tmp !== undefined) - result = tmp; - } - - return result; -}; - -DERNode.prototype._decodeTime = function decodeTime(buffer, tag) { - const str = buffer.raw().toString(); - - let year; - let mon; - let day; - let hour; - let min; - let sec; - if (tag === 'gentime') { - year = str.slice(0, 4) | 0; - mon = str.slice(4, 6) | 0; - day = str.slice(6, 8) | 0; - hour = str.slice(8, 10) | 0; - min = str.slice(10, 12) | 0; - sec = str.slice(12, 14) | 0; - } else if (tag === 'utctime') { - year = str.slice(0, 2) | 0; - mon = str.slice(2, 4) | 0; - day = str.slice(4, 6) | 0; - hour = str.slice(6, 8) | 0; - min = str.slice(8, 10) | 0; - sec = str.slice(10, 12) | 0; - if (year < 70) - year = 2000 + year; - else - year = 1900 + year; - } else { - return buffer.error('Decoding ' + tag + ' time is not supported yet'); - } - - return Date.UTC(year, mon - 1, day, hour, min, sec, 0); -}; - -DERNode.prototype._decodeNull = function decodeNull() { - return null; -}; - -DERNode.prototype._decodeBool = function decodeBool(buffer) { - const res = buffer.readUInt8(); - if (buffer.isError(res)) - return res; - else - return res !== 0; -}; - -DERNode.prototype._decodeInt = function decodeInt(buffer, values) { - // Bigint, return as it is (assume big endian) - const raw = buffer.raw(); - let res = new bignum(raw); - - if (values) - res = values[res.toString(10)] || res; - - return res; -}; - -DERNode.prototype._use = function use(entity, obj) { - if (typeof entity === 'function') - entity = entity(obj); - return entity._getDecoder('der').tree; -}; - -// Utility methods - -function derDecodeTag(buf, fail) { - let tag = buf.readUInt8(fail); - if (buf.isError(tag)) - return tag; - - const cls = der.tagClass[tag >> 6]; - const primitive = (tag & 0x20) === 0; - - // Multi-octet tag - load - if ((tag & 0x1f) === 0x1f) { - let oct = tag; - tag = 0; - while ((oct & 0x80) === 0x80) { - oct = buf.readUInt8(fail); - if (buf.isError(oct)) - return oct; - - tag <<= 7; - tag |= oct & 0x7f; - } - } else { - tag &= 0x1f; - } - const tagStr = der.tag[tag]; - - return { - cls: cls, - primitive: primitive, - tag: tag, - tagStr: tagStr - }; -} - -function derDecodeLen(buf, primitive, fail) { - let len = buf.readUInt8(fail); - if (buf.isError(len)) - return len; - - // Indefinite form - if (!primitive && len === 0x80) - return null; - - // Definite form - if ((len & 0x80) === 0) { - // Short form - return len; - } - - // Long form - const num = len & 0x7f; - if (num > 4) - return buf.error('length octect is too long'); - - len = 0; - for (let i = 0; i < num; i++) { - len <<= 8; - const j = buf.readUInt8(fail); - if (buf.isError(j)) - return j; - len |= j; - } - - return len; -} - -},{"inherits":"Bm0n","bn.js":"BOxy","../base/buffer":"JJX4","../base/node":"kZXB","../constants/der":"psPF"}],"byl7":[function(require,module,exports) { - -'use strict'; - -const inherits = require('inherits'); -const Buffer = require('buffer').Buffer; - -const DERDecoder = require('./der'); - -function PEMDecoder(entity) { - DERDecoder.call(this, entity); - this.enc = 'pem'; -} -inherits(PEMDecoder, DERDecoder); -module.exports = PEMDecoder; - -PEMDecoder.prototype.decode = function decode(data, options) { - const lines = data.toString().split(/[\r\n]+/g); - - const label = options.label.toUpperCase(); - - const re = /^-----(BEGIN|END) ([^-]+)-----$/; - let start = -1; - let end = -1; - for (let i = 0; i < lines.length; i++) { - const match = lines[i].match(re); - if (match === null) - continue; - - if (match[2] !== label) - continue; - - if (start === -1) { - if (match[1] !== 'BEGIN') - break; - start = i; - } else { - if (match[1] !== 'END') - break; - end = i; - break; - } - } - if (start === -1 || end === -1) - throw new Error('PEM section not found for: ' + label); - - const base64 = lines.slice(start + 1, end).join(''); - // Remove excessive symbols - base64.replace(/[^a-z0-9+/=]+/gi, ''); - - const input = new Buffer(base64, 'base64'); - return DERDecoder.prototype.decode.call(this, input, options); -}; - -},{"inherits":"Bm0n","buffer":"dskh","./der":"Hd0I"}],"Sn5H":[function(require,module,exports) { -'use strict'; - -const decoders = exports; - -decoders.der = require('./der'); -decoders.pem = require('./pem'); - -},{"./der":"Hd0I","./pem":"byl7"}],"gOko":[function(require,module,exports) { -'use strict'; - -const encoders = require('./encoders'); -const decoders = require('./decoders'); -const inherits = require('inherits'); - -const api = exports; - -api.define = function define(name, body) { - return new Entity(name, body); -}; - -function Entity(name, body) { - this.name = name; - this.body = body; - - this.decoders = {}; - this.encoders = {}; -} - -Entity.prototype._createNamed = function createNamed(Base) { - const name = this.name; - - function Generated(entity) { - this._initNamed(entity, name); - } - inherits(Generated, Base); - Generated.prototype._initNamed = function _initNamed(entity, name) { - Base.call(this, entity, name); - }; - - return new Generated(this); -}; - -Entity.prototype._getDecoder = function _getDecoder(enc) { - enc = enc || 'der'; - // Lazily create decoder - if (!this.decoders.hasOwnProperty(enc)) - this.decoders[enc] = this._createNamed(decoders[enc]); - return this.decoders[enc]; -}; - -Entity.prototype.decode = function decode(data, enc, options) { - return this._getDecoder(enc).decode(data, options); -}; - -Entity.prototype._getEncoder = function _getEncoder(enc) { - enc = enc || 'der'; - // Lazily create encoder - if (!this.encoders.hasOwnProperty(enc)) - this.encoders[enc] = this._createNamed(encoders[enc]); - return this.encoders[enc]; -}; - -Entity.prototype.encode = function encode(data, enc, /* internal */ reporter) { - return this._getEncoder(enc).encode(data, reporter); -}; - -},{"./encoders":"YGCS","./decoders":"Sn5H","inherits":"Bm0n"}],"G4cX":[function(require,module,exports) { -'use strict'; - -const base = exports; - -base.Reporter = require('./reporter').Reporter; -base.DecoderBuffer = require('./buffer').DecoderBuffer; -base.EncoderBuffer = require('./buffer').EncoderBuffer; -base.Node = require('./node'); - -},{"./reporter":"BhoU","./buffer":"JJX4","./node":"kZXB"}],"yW9S":[function(require,module,exports) { -'use strict'; - -const constants = exports; - -// Helper -constants._reverse = function reverse(map) { - const res = {}; - - Object.keys(map).forEach(function(key) { - // Convert key to integer if it is stringified - if ((key | 0) == key) - key = key | 0; - - const value = map[key]; - res[value] = key; - }); - - return res; -}; - -constants.der = require('./der'); - -},{"./der":"psPF"}],"NNmB":[function(require,module,exports) { -'use strict'; - -const asn1 = exports; - -asn1.bignum = require('bn.js'); - -asn1.define = require('./asn1/api').define; -asn1.base = require('./asn1/base'); -asn1.constants = require('./asn1/constants'); -asn1.decoders = require('./asn1/decoders'); -asn1.encoders = require('./asn1/encoders'); - -},{"bn.js":"BOxy","./asn1/api":"gOko","./asn1/base":"G4cX","./asn1/constants":"yW9S","./asn1/decoders":"Sn5H","./asn1/encoders":"YGCS"}],"sYCp":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const bn_js_1 = __importDefault(require("bn.js")); -const elliptic_1 = require("elliptic"); -// @ts-ignore -const asn1_js_1 = __importDefault(require("asn1.js")); -const ECPrivateKeyASN = asn1_js_1.default.define('ECPrivateKey', function () { - // @ts-ignore - const self = this; - self.seq().obj(self.key('version').int(), self.key('privateKey').octstr(), self.key('parameters').explicit(0).objid().optional(), self.key('publicKey').explicit(1).bitstr().optional()); -}); -const SubjectPublicKeyInfoASN = asn1_js_1.default.define('SubjectPublicKeyInfo', function () { - // @ts-ignore - const self = this; - self.seq().obj(self.key('algorithm').seq().obj(self.key("id").objid(), self.key("curve").objid()), self.key('pub').bitstr()); -}); -const curves = { - secp256k1: { - curveParameters: [1, 3, 132, 0, 10], - privatePEMOptions: { label: 'EC PRIVATE KEY' }, - publicPEMOptions: { label: 'PUBLIC KEY' }, - curve: new elliptic_1.ec('secp256k1') - } -}; -class KeyEncoder { - constructor(options) { - if (typeof options === 'string') { - if (options !== 'secp256k1') { - throw new Error('Unknown curve ' + options); - } - options = curves[options]; - } - this.options = options; - this.algorithmID = [1, 2, 840, 10045, 2, 1]; - } - privateKeyObject(rawPrivateKey, rawPublicKey) { - const privateKeyObject = { - version: new bn_js_1.default(1), - privateKey: Buffer.from(rawPrivateKey, 'hex'), - parameters: this.options.curveParameters - }; - if (rawPublicKey) { - privateKeyObject.publicKey = { - unused: 0, - data: Buffer.from(rawPublicKey, 'hex') - }; - } - return privateKeyObject; - } - publicKeyObject(rawPublicKey) { - return { - algorithm: { - id: this.algorithmID, - curve: this.options.curveParameters - }, - pub: { - unused: 0, - data: Buffer.from(rawPublicKey, 'hex') - } - }; - } - encodePrivate(privateKey, originalFormat, destinationFormat) { - let privateKeyObject; - /* Parse the incoming private key and convert it to a private key object */ - if (originalFormat === 'raw') { - if (typeof privateKey !== 'string') { - throw 'private key must be a string'; - } - let keyPair = this.options.curve.keyFromPrivate(privateKey, 'hex'); - let rawPublicKey = keyPair.getPublic('hex'); - privateKeyObject = this.privateKeyObject(privateKey, rawPublicKey); - } - else if (originalFormat === 'der') { - if (typeof privateKey !== 'string') { - // do nothing - } - else if (typeof privateKey === 'string') { - privateKey = Buffer.from(privateKey, 'hex'); - } - else { - throw 'private key must be a buffer or a string'; - } - privateKeyObject = ECPrivateKeyASN.decode(privateKey, 'der'); - } - else if (originalFormat === 'pem') { - if (typeof privateKey !== 'string') { - throw 'private key must be a string'; - } - privateKeyObject = ECPrivateKeyASN.decode(privateKey, 'pem', this.options.privatePEMOptions); - } - else { - throw 'invalid private key format'; - } - /* Export the private key object to the desired format */ - if (destinationFormat === 'raw') { - return privateKeyObject.privateKey.toString('hex'); - } - else if (destinationFormat === 'der') { - return ECPrivateKeyASN.encode(privateKeyObject, 'der').toString('hex'); - } - else if (destinationFormat === 'pem') { - return ECPrivateKeyASN.encode(privateKeyObject, 'pem', this.options.privatePEMOptions); - } - else { - throw 'invalid destination format for private key'; - } - } - encodePublic(publicKey, originalFormat, destinationFormat) { - let publicKeyObject; - /* Parse the incoming public key and convert it to a public key object */ - if (originalFormat === 'raw') { - if (typeof publicKey !== 'string') { - throw 'public key must be a string'; - } - publicKeyObject = this.publicKeyObject(publicKey); - } - else if (originalFormat === 'der') { - if (typeof publicKey !== 'string') { - // do nothing - } - else if (typeof publicKey === 'string') { - publicKey = Buffer.from(publicKey, 'hex'); - } - else { - throw 'public key must be a buffer or a string'; - } - publicKeyObject = SubjectPublicKeyInfoASN.decode(publicKey, 'der'); - } - else if (originalFormat === 'pem') { - if (typeof publicKey !== 'string') { - throw 'public key must be a string'; - } - publicKeyObject = SubjectPublicKeyInfoASN.decode(publicKey, 'pem', this.options.publicPEMOptions); - } - else { - throw 'invalid public key format'; - } - /* Export the private key object to the desired format */ - if (destinationFormat === 'raw') { - return publicKeyObject.pub.data.toString('hex'); - } - else if (destinationFormat === 'der') { - return SubjectPublicKeyInfoASN.encode(publicKeyObject, 'der').toString('hex'); - } - else if (destinationFormat === 'pem') { - return SubjectPublicKeyInfoASN.encode(publicKeyObject, 'pem', this.options.publicPEMOptions); - } - else { - throw 'invalid destination format for public key'; - } - } -} -KeyEncoder.ECPrivateKeyASN = ECPrivateKeyASN; -KeyEncoder.SubjectPublicKeyInfoASN = SubjectPublicKeyInfoASN; -exports.default = KeyEncoder; - -},{"bn.js":"BOxy","elliptic":"xha3","asn1.js":"NNmB","buffer":"dskh"}],"le8S":[function(require,module,exports) { -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const key_encoder_1 = __importDefault(require("./key-encoder")); -exports.default = key_encoder_1.default; - -},{"./key-encoder":"sYCp"}],"JZSy":[function(require,module,exports) { -'use strict'; - -function getParamSize(keySize) { - var result = ((keySize / 8) | 0) + (keySize % 8 === 0 ? 0 : 1); - return result; -} - -var paramBytesForAlg = { - ES256: getParamSize(256), - ES384: getParamSize(384), - ES512: getParamSize(521) -}; - -function getParamBytesForAlg(alg) { - var paramBytes = paramBytesForAlg[alg]; - if (paramBytes) { - return paramBytes; - } - - throw new Error('Unknown algorithm "' + alg + '"'); -} - -module.exports = getParamBytesForAlg; - -},{}],"qrjx":[function(require,module,exports) { - -'use strict'; - -var Buffer = require('safe-buffer').Buffer; - -var getParamBytesForAlg = require('./param-bytes-for-alg'); - -var MAX_OCTET = 0x80, - CLASS_UNIVERSAL = 0, - PRIMITIVE_BIT = 0x20, - TAG_SEQ = 0x10, - TAG_INT = 0x02, - ENCODED_TAG_SEQ = (TAG_SEQ | PRIMITIVE_BIT) | (CLASS_UNIVERSAL << 6), - ENCODED_TAG_INT = TAG_INT | (CLASS_UNIVERSAL << 6); - -function base64Url(base64) { - return base64 - .replace(/=/g, '') - .replace(/\+/g, '-') - .replace(/\//g, '_'); -} - -function signatureAsBuffer(signature) { - if (Buffer.isBuffer(signature)) { - return signature; - } else if ('string' === typeof signature) { - return Buffer.from(signature, 'base64'); - } - - throw new TypeError('ECDSA signature must be a Base64 string or a Buffer'); -} - -function derToJose(signature, alg) { - signature = signatureAsBuffer(signature); - var paramBytes = getParamBytesForAlg(alg); - - // the DER encoded param should at most be the param size, plus a padding - // zero, since due to being a signed integer - var maxEncodedParamLength = paramBytes + 1; - - var inputLength = signature.length; - - var offset = 0; - if (signature[offset++] !== ENCODED_TAG_SEQ) { - throw new Error('Could not find expected "seq"'); - } - - var seqLength = signature[offset++]; - if (seqLength === (MAX_OCTET | 1)) { - seqLength = signature[offset++]; - } - - if (inputLength - offset < seqLength) { - throw new Error('"seq" specified length of "' + seqLength + '", only "' + (inputLength - offset) + '" remaining'); - } - - if (signature[offset++] !== ENCODED_TAG_INT) { - throw new Error('Could not find expected "int" for "r"'); - } - - var rLength = signature[offset++]; - - if (inputLength - offset - 2 < rLength) { - throw new Error('"r" specified length of "' + rLength + '", only "' + (inputLength - offset - 2) + '" available'); - } - - if (maxEncodedParamLength < rLength) { - throw new Error('"r" specified length of "' + rLength + '", max of "' + maxEncodedParamLength + '" is acceptable'); - } - - var rOffset = offset; - offset += rLength; - - if (signature[offset++] !== ENCODED_TAG_INT) { - throw new Error('Could not find expected "int" for "s"'); - } - - var sLength = signature[offset++]; - - if (inputLength - offset !== sLength) { - throw new Error('"s" specified length of "' + sLength + '", expected "' + (inputLength - offset) + '"'); - } - - if (maxEncodedParamLength < sLength) { - throw new Error('"s" specified length of "' + sLength + '", max of "' + maxEncodedParamLength + '" is acceptable'); - } - - var sOffset = offset; - offset += sLength; - - if (offset !== inputLength) { - throw new Error('Expected to consume entire buffer, but "' + (inputLength - offset) + '" bytes remain'); - } - - var rPadding = paramBytes - rLength, - sPadding = paramBytes - sLength; - - var dst = Buffer.allocUnsafe(rPadding + rLength + sPadding + sLength); - - for (offset = 0; offset < rPadding; ++offset) { - dst[offset] = 0; - } - signature.copy(dst, offset, rOffset + Math.max(-rPadding, 0), rOffset + rLength); - - offset = paramBytes; - - for (var o = offset; offset < o + sPadding; ++offset) { - dst[offset] = 0; - } - signature.copy(dst, offset, sOffset + Math.max(-sPadding, 0), sOffset + sLength); - - dst = dst.toString('base64'); - dst = base64Url(dst); - - return dst; -} - -function countPadding(buf, start, stop) { - var padding = 0; - while (start + padding < stop && buf[start + padding] === 0) { - ++padding; - } - - var needsSign = buf[start + padding] >= MAX_OCTET; - if (needsSign) { - --padding; - } - - return padding; -} - -function joseToDer(signature, alg) { - signature = signatureAsBuffer(signature); - var paramBytes = getParamBytesForAlg(alg); - - var signatureBytes = signature.length; - if (signatureBytes !== paramBytes * 2) { - throw new TypeError('"' + alg + '" signatures must be "' + paramBytes * 2 + '" bytes, saw "' + signatureBytes + '"'); - } - - var rPadding = countPadding(signature, 0, paramBytes); - var sPadding = countPadding(signature, paramBytes, signature.length); - var rLength = paramBytes - rPadding; - var sLength = paramBytes - sPadding; - - var rsBytes = 1 + 1 + rLength + 1 + 1 + sLength; - - var shortLength = rsBytes < MAX_OCTET; - - var dst = Buffer.allocUnsafe((shortLength ? 2 : 3) + rsBytes); - - var offset = 0; - dst[offset++] = ENCODED_TAG_SEQ; - if (shortLength) { - // Bit 8 has value "0" - // bits 7-1 give the length. - dst[offset++] = rsBytes; - } else { - // Bit 8 of first octet has value "1" - // bits 7-1 give the number of additional length octets. - dst[offset++] = MAX_OCTET | 1; - // length, base 256 - dst[offset++] = rsBytes & 0xff; - } - dst[offset++] = ENCODED_TAG_INT; - dst[offset++] = rLength; - if (rPadding < 0) { - dst[offset++] = 0; - offset += signature.copy(dst, offset, 0, paramBytes); - } else { - offset += signature.copy(dst, offset, rPadding, paramBytes); - } - dst[offset++] = ENCODED_TAG_INT; - dst[offset++] = sLength; - if (sPadding < 0) { - dst[offset++] = 0; - signature.copy(dst, offset, paramBytes); - } else { - signature.copy(dst, offset, paramBytes + sPadding); - } - - return dst; -} - -module.exports = { - derToJose: derToJose, - joseToDer: joseToDer -}; - -},{"safe-buffer":"Wugr","./param-bytes-for-alg":"JZSy"}],"rdic":[function(require,module,exports) { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -class MissingParametersError extends Error { - constructor(message) { - super(); - this.name = 'MissingParametersError'; - this.message = (message || ''); - } -} -exports.MissingParametersError = MissingParametersError; -class InvalidTokenError extends Error { - constructor(message) { - super(); - this.name = 'InvalidTokenError'; - this.message = (message || ''); - } -} -exports.InvalidTokenError = InvalidTokenError; - -},{}],"BoDh":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const elliptic_1 = require("elliptic"); -const crypto_1 = require("crypto"); -const key_encoder_1 = __importDefault(require("key-encoder")); -const ecdsa_sig_formatter_1 = require("ecdsa-sig-formatter"); -const errors_1 = require("../errors"); -class SECP256K1Client { - constructor() { - } - static createHash(signingInput) { - return crypto_1.createHash('sha256').update(signingInput).digest(); - } - static loadPrivateKey(rawPrivateKey) { - if (rawPrivateKey.length === 66) { - rawPrivateKey = rawPrivateKey.slice(0, 64); - } - return SECP256K1Client.ec.keyFromPrivate(rawPrivateKey); - } - static loadPublicKey(rawPublicKey) { - return SECP256K1Client.ec.keyFromPublic(rawPublicKey, 'hex'); - } - static encodePublicKey(publicKey, originalFormat, destinationFormat) { - return SECP256K1Client.keyEncoder.encodePublic(publicKey, originalFormat, destinationFormat); - } - static derivePublicKey(privateKey, compressed = true) { - if (typeof privateKey !== 'string') { - throw Error('private key must be a string'); - } - if (!(/^[0-9A-F]+$/i.test(privateKey))) { - throw Error('private key must be a hex string'); - } - if (privateKey.length == 66) { - privateKey = privateKey.slice(0, 64); - } - else if (privateKey.length <= 64) { - // do nothing - } - else { - throw Error('private key must be 66 characters or less'); - } - const keypair = SECP256K1Client.ec.keyFromPrivate(privateKey); - return keypair.getPublic(compressed, 'hex'); - } - static signHash(signingInputHash, rawPrivateKey, format = 'jose') { - // make sure the required parameters are provided - if (!(signingInputHash && rawPrivateKey)) { - throw new errors_1.MissingParametersError('a signing input hash and private key are all required'); - } - // prepare the private key - const privateKeyObject = SECP256K1Client.loadPrivateKey(rawPrivateKey); - // calculate the signature - const signatureObject = privateKeyObject.sign(signingInputHash); - const derSignature = Buffer.from(signatureObject.toDER()); - if (format === 'der') { - return derSignature.toString('hex'); - } - else if (format === 'jose') { - // return the JOSE-formatted signature - return ecdsa_sig_formatter_1.derToJose(derSignature, 'ES256'); - } - else { - throw Error('Invalid signature format'); - } - } - static loadSignature(joseSignature) { - // create and return the DER-formatted signature buffer - return ecdsa_sig_formatter_1.joseToDer(joseSignature, 'ES256'); - } - static verifyHash(signingInputHash, derSignatureBuffer, rawPublicKey) { - // make sure the required parameters are provided - if (!(signingInputHash && derSignatureBuffer && rawPublicKey)) { - throw new errors_1.MissingParametersError('a signing input hash, der signature, and public key are all required'); - } - // prepare the public key - const publicKeyObject = SECP256K1Client.loadPublicKey(rawPublicKey); - // verify the token - return publicKeyObject.verify(signingInputHash, derSignatureBuffer); - } -} -SECP256K1Client.ec = new elliptic_1.ec('secp256k1'); -SECP256K1Client.algorithmName = 'ES256K'; -SECP256K1Client.keyEncoder = new key_encoder_1.default({ - curveParameters: [1, 3, 132, 0, 10], - privatePEMOptions: { label: 'EC PRIVATE KEY' }, - publicPEMOptions: { label: 'PUBLIC KEY' }, - curve: SECP256K1Client.ec -}); -exports.SECP256K1Client = SECP256K1Client; - -},{"elliptic":"xha3","crypto":"mRF4","key-encoder":"le8S","ecdsa-sig-formatter":"qrjx","../errors":"rdic","buffer":"dskh"}],"GcyT":[function(require,module,exports) { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const secp256k1_1 = require("./secp256k1"); -exports.SECP256K1Client = secp256k1_1.SECP256K1Client; -const cryptoClients = { - ES256K: secp256k1_1.SECP256K1Client -}; -exports.cryptoClients = cryptoClients; - -},{"./secp256k1":"BoDh"}],"vlzQ":[function(require,module,exports) { -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const base64url_1 = __importDefault(require("base64url")); -const cryptoClients_1 = require("./cryptoClients"); -const errors_1 = require("./errors"); -function createSigningInput(payload, header) { - const tokenParts = []; - // add in the header - const encodedHeader = base64url_1.default.encode(JSON.stringify(header)); - tokenParts.push(encodedHeader); - // add in the payload - const encodedPayload = base64url_1.default.encode(JSON.stringify(payload)); - tokenParts.push(encodedPayload); - // prepare the message - const signingInput = tokenParts.join('.'); - // return the signing input - return signingInput; -} -function createUnsecuredToken(payload) { - const header = { typ: 'JWT', alg: 'none' }; - return createSigningInput(payload, header) + '.'; -} -exports.createUnsecuredToken = createUnsecuredToken; -class TokenSigner { - constructor(signingAlgorithm, rawPrivateKey) { - if (!(signingAlgorithm && rawPrivateKey)) { - throw new errors_1.MissingParametersError('a signing algorithm and private key are required'); - } - if (typeof signingAlgorithm !== 'string') { - throw new Error('signing algorithm parameter must be a string'); - } - signingAlgorithm = signingAlgorithm.toUpperCase(); - if (!cryptoClients_1.cryptoClients.hasOwnProperty(signingAlgorithm)) { - throw new Error('invalid signing algorithm'); - } - this.tokenType = 'JWT'; - this.cryptoClient = cryptoClients_1.cryptoClients[signingAlgorithm]; - this.rawPrivateKey = rawPrivateKey; - } - header(header = {}) { - const defaultHeader = { typ: this.tokenType, - alg: this.cryptoClient.algorithmName }; - return Object.assign({}, defaultHeader, header); - } - sign(payload, expanded = false, customHeader = {}) { - // generate the token header - const header = this.header(customHeader); - // prepare the message to be signed - const signingInput = createSigningInput(payload, header); - const signingInputHash = this.cryptoClient.createHash(signingInput); - // sign the message and add in the signature - const signature = this.cryptoClient.signHash(signingInputHash, this.rawPrivateKey); - if (expanded) { - return { - 'header': [ - base64url_1.default.encode(JSON.stringify(header)) - ], - 'payload': JSON.stringify(payload), - 'signature': [ - signature - ] - }; - } - else { - return [signingInput, signature].join('.'); - } - } -} -exports.TokenSigner = TokenSigner; - -},{"base64url":"XVTP","./cryptoClients":"GcyT","./errors":"rdic"}],"ucpS":[function(require,module,exports) { -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const base64url_1 = __importDefault(require("base64url")); -const cryptoClients_1 = require("./cryptoClients"); -const errors_1 = require("./errors"); -class TokenVerifier { - constructor(signingAlgorithm, rawPublicKey) { - if (!(signingAlgorithm && rawPublicKey)) { - throw new errors_1.MissingParametersError('a signing algorithm and public key are required'); - } - if (typeof signingAlgorithm !== 'string') { - throw 'signing algorithm parameter must be a string'; - } - signingAlgorithm = signingAlgorithm.toUpperCase(); - if (!cryptoClients_1.cryptoClients.hasOwnProperty(signingAlgorithm)) { - throw 'invalid signing algorithm'; - } - this.tokenType = 'JWT'; - this.cryptoClient = cryptoClients_1.cryptoClients[signingAlgorithm]; - this.rawPublicKey = rawPublicKey; - } - verify(token) { - if (typeof token === 'string') { - return this.verifyCompact(token); - } - else if (typeof token === 'object') { - return this.verifyExpanded(token); - } - else { - return false; - } - } - verifyCompact(token) { - // decompose the token into parts - const tokenParts = token.split('.'); - // calculate the signing input hash - const signingInput = tokenParts[0] + '.' + tokenParts[1]; - const signingInputHash = this.cryptoClient.createHash(signingInput); - // extract the signature as a DER array - const derSignatureBuffer = this.cryptoClient.loadSignature(tokenParts[2]); - // verify the signed hash - return this.cryptoClient.verifyHash(signingInputHash, derSignatureBuffer, this.rawPublicKey); - } - verifyExpanded(token) { - const signingInput = [ - token['header'].join('.'), - base64url_1.default.encode(token['payload']) - ].join('.'); - const signingInputHash = this.cryptoClient.createHash(signingInput); - let verified = true; - token['signature'].map((signature) => { - const derSignatureBuffer = this.cryptoClient.loadSignature(signature); - const signatureVerified = this.cryptoClient.verifyHash(signingInputHash, derSignatureBuffer, this.rawPublicKey); - if (!signatureVerified) { - verified = false; - } - }); - return verified; - } -} -exports.TokenVerifier = TokenVerifier; - -},{"base64url":"XVTP","./cryptoClients":"GcyT","./errors":"rdic"}],"ZM9j":[function(require,module,exports) { -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const base64url_1 = __importDefault(require("base64url")); -function decodeToken(token) { - if (typeof token === 'string') { - // decompose the token into parts - const tokenParts = token.split('.'); - const header = JSON.parse(base64url_1.default.decode(tokenParts[0])); - const payload = JSON.parse(base64url_1.default.decode(tokenParts[1])); - const signature = tokenParts[2]; - // return the token object - return { - header: header, - payload: payload, - signature: signature - }; - } - else if (typeof token === 'object') { - if (typeof token.payload !== 'string') { - throw new Error('Expected token payload to be a base64 or json string'); - } - let payload = token.payload; - if (token.payload[0] !== '{') { - payload = base64url_1.default.decode(payload); - } - const allHeaders = []; - token.header.map((headerValue) => { - const header = JSON.parse(base64url_1.default.decode(headerValue)); - allHeaders.push(header); - }); - return { - header: allHeaders, - payload: JSON.parse(payload), - signature: token.signature - }; - } -} -exports.decodeToken = decodeToken; - -},{"base64url":"XVTP"}],"ap7v":[function(require,module,exports) { -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -var signer_1 = require("./signer"); -exports.TokenSigner = signer_1.TokenSigner; -exports.createUnsecuredToken = signer_1.createUnsecuredToken; -var verifier_1 = require("./verifier"); -exports.TokenVerifier = verifier_1.TokenVerifier; -var decode_1 = require("./decode"); -exports.decodeToken = decode_1.decodeToken; -var errors_1 = require("./errors"); -exports.MissingParametersError = errors_1.MissingParametersError; -exports.InvalidTokenError = errors_1.InvalidTokenError; -var cryptoClients_1 = require("./cryptoClients"); -exports.SECP256K1Client = cryptoClients_1.SECP256K1Client; -exports.cryptoClients = cryptoClients_1.cryptoClients; - -},{"./signer":"vlzQ","./verifier":"ucpS","./decode":"ZM9j","./errors":"rdic","./cryptoClients":"GcyT"}],"m5br":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.Encryption = void 0; - -var ncrypto = _interopRequireWildcard(require("crypto")); - -var _error = require("./error"); - -function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; if (obj != null) { var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } - -var __awaiter = void 0 && (void 0).__awaiter || function (thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function (resolve) { - resolve(value); - }); - } - - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; - -var __generator = void 0 && (void 0).__generator || function (thisArg, body) { - var _ = { - label: 0, - sent: function sent() { - if (t[0] & 1) throw t[1]; - return t[1]; - }, - trys: [], - ops: [] - }, - f, - y, - t, - g; - return g = { - next: verb(0), - "throw": verb(1), - "return": verb(2) - }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { - return this; - }), g; - - function verb(n) { - return function (v) { - return step([n, v]); - }; - } - - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - - while (_) { - try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - - switch (op[0]) { - case 0: - case 1: - t = op; - break; - - case 4: - _.label++; - return { - value: op[1], - done: false - }; - - case 5: - _.label++; - y = op[1]; - op = [0]; - continue; - - case 7: - op = _.ops.pop(); - - _.trys.pop(); - - continue; - - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { - _ = 0; - continue; - } - - if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) { - _.label = op[1]; - break; - } - - if (op[0] === 6 && _.label < t[1]) { - _.label = t[1]; - t = op; - break; - } - - if (t && _.label < t[2]) { - _.label = t[2]; - - _.ops.push(op); - - break; - } - - if (t[2]) _.ops.pop(); - - _.trys.pop(); - - continue; - } - - op = body.call(thisArg, _); - } catch (e) { - op = [6, e]; - y = 0; - } finally { - f = t = 0; - } - } - - if (op[0] & 5) throw op[1]; - return { - value: op[0] ? op[1] : void 0, - done: true - }; - } -}; - -var typedArrayToBuffer = function typedArrayToBuffer(array) { - return array.buffer.slice(array.byteOffset, array.byteLength + array.byteOffset); -}; - -var Encryption = -/** @class */ -function () { - function Encryption() {} - - Encryption.encryptJSON = function (jsonObj, password) { - return __awaiter(void 0, void 0, Promise, function () { - var plainText; - return __generator(this, function (_a) { - plainText = JSON.stringify(jsonObj); - return [2 - /*return*/ - , Encryption.encryptText(plainText, password)]; - }); - }); - }; - - Encryption.decryptJSON = function (ctBufferBase64, ivBase64, password) { - return __awaiter(void 0, void 0, Promise, function () { - var JSONString; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - return [4 - /*yield*/ - , Encryption.decryptText(ctBufferBase64, ivBase64, password)]; - - case 1: - JSONString = _a.sent(); - return [2 - /*return*/ - , JSON.parse(JSONString)]; - } - }); - }); - }; - - Encryption.encryptText = function (plainText, password) { - return __awaiter(void 0, void 0, Promise, function () { - var ptUtf8, pwUtf8, encrypt, hash, pwHash, iv; - return __generator(this, function (_a) { - ptUtf8 = Buffer.from(plainText, "UTF-8"); - pwUtf8 = Buffer.from(password, "UTF-8"); - - encrypt = function encrypt(text, eiv, ekey) { - var cipher = ncrypto.createCipheriv("aes-256-gcm", Buffer.from(ekey), Buffer.from(eiv)); - var encrypted = cipher.update(text); - encrypted = Buffer.concat([encrypted, cipher.final(), cipher.getAuthTag()]); - return { - iv: Buffer.from(eiv).toString("base64"), - encBuffer: encrypted.toString("base64") - }; - }; - - hash = ncrypto.createHash("sha256"); - hash.update(pwUtf8); - pwHash = typedArrayToBuffer(hash.digest()); - iv = crypto.getRandomValues(new Uint8Array(12)); - return [2 - /*return*/ - , encrypt(ptUtf8, iv, pwHash)]; - }); - }); - }; - - Encryption.decryptText = function (ctBufferBase64, ivBase64, password) { - return __awaiter(void 0, void 0, Promise, function () { - var ctBuffer, iv, pwUtf8, hash, pwHash, decrypt, ptBuffer; - return __generator(this, function (_a) { - ctBuffer = Buffer.from(ctBufferBase64, "base64"); - iv = Buffer.from(ivBase64, "base64"); - pwUtf8 = Buffer.from(password); - hash = ncrypto.createHash("sha256"); - hash.update(pwUtf8); - pwHash = typedArrayToBuffer(hash.digest()); - - decrypt = function decrypt(buffer, eiv, ekey, tagLength) { - var decipher = ncrypto.createDecipheriv("aes-256-gcm", Buffer.from(ekey), eiv); - var tag = buffer.slice(buffer.byteLength - tagLength); - var text = buffer.slice(0, buffer.byteLength - tagLength); - decipher.setAuthTag(tag); - return Buffer.concat([decipher.update(text), decipher.final()]); - }; - - try { - ptBuffer = decrypt(ctBuffer, iv, pwHash, 16); - } catch (err) { - if (err instanceof DOMException) { - throw _error.ErrorHelper.getPackageError(err, _error.PackageErrorCode.DecryptionFailed); - } - - throw err; - } - - return [2 - /*return*/ - , ptBuffer.toString()]; - }); - }); - }; - - return Encryption; -}(); - -exports.Encryption = Encryption; -},{"crypto":"mRF4","./error":"yXIU","buffer":"dskh"}],"V9ao":[function(require,module,exports) { -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var createHash = require('create-hash'); - -var createHmac = require('create-hmac'); - -function hash160(buffer) { - var sha256Hash = createHash('sha256').update(buffer).digest(); - - try { - return createHash('rmd160').update(sha256Hash).digest(); - } catch (err) { - return createHash('ripemd160').update(sha256Hash).digest(); - } -} - -exports.hash160 = hash160; - -function hmacSHA512(key, data) { - return createHmac('sha512', key).update(data).digest(); -} - -exports.hmacSHA512 = hmacSHA512; -},{"create-hash":"LF8r","create-hmac":"Cx6S"}],"g2zT":[function(require,module,exports) { -'use strict' -// base-x encoding / decoding -// Copyright (c) 2018 base-x contributors -// Copyright (c) 2014-2018 The Bitcoin Core developers (base58.cpp) -// Distributed under the MIT software license, see the accompanying -// file LICENSE or http://www.opensource.org/licenses/mit-license.php. -// @ts-ignore -var _Buffer = require('safe-buffer').Buffer -function base (ALPHABET) { - if (ALPHABET.length >= 255) { throw new TypeError('Alphabet too long') } - var BASE_MAP = new Uint8Array(256) - BASE_MAP.fill(255) - for (var i = 0; i < ALPHABET.length; i++) { - var x = ALPHABET.charAt(i) - var xc = x.charCodeAt(0) - if (BASE_MAP[xc] !== 255) { throw new TypeError(x + ' is ambiguous') } - BASE_MAP[xc] = i - } - var BASE = ALPHABET.length - var LEADER = ALPHABET.charAt(0) - var FACTOR = Math.log(BASE) / Math.log(256) // log(BASE) / log(256), rounded up - var iFACTOR = Math.log(256) / Math.log(BASE) // log(256) / log(BASE), rounded up - function encode (source) { - if (!_Buffer.isBuffer(source)) { throw new TypeError('Expected Buffer') } - if (source.length === 0) { return '' } - // Skip & count leading zeroes. - var zeroes = 0 - var length = 0 - var pbegin = 0 - var pend = source.length - while (pbegin !== pend && source[pbegin] === 0) { - pbegin++ - zeroes++ - } - // Allocate enough space in big-endian base58 representation. - var size = ((pend - pbegin) * iFACTOR + 1) >>> 0 - var b58 = new Uint8Array(size) - // Process the bytes. - while (pbegin !== pend) { - var carry = source[pbegin] - // Apply "b58 = b58 * 256 + ch". - var i = 0 - for (var it1 = size - 1; (carry !== 0 || i < length) && (it1 !== -1); it1--, i++) { - carry += (256 * b58[it1]) >>> 0 - b58[it1] = (carry % BASE) >>> 0 - carry = (carry / BASE) >>> 0 - } - if (carry !== 0) { throw new Error('Non-zero carry') } - length = i - pbegin++ - } - // Skip leading zeroes in base58 result. - var it2 = size - length - while (it2 !== size && b58[it2] === 0) { - it2++ - } - // Translate the result into a string. - var str = LEADER.repeat(zeroes) - for (; it2 < size; ++it2) { str += ALPHABET.charAt(b58[it2]) } - return str - } - function decodeUnsafe (source) { - if (typeof source !== 'string') { throw new TypeError('Expected String') } - if (source.length === 0) { return _Buffer.alloc(0) } - var psz = 0 - // Skip leading spaces. - if (source[psz] === ' ') { return } - // Skip and count leading '1's. - var zeroes = 0 - var length = 0 - while (source[psz] === LEADER) { - zeroes++ - psz++ - } - // Allocate enough space in big-endian base256 representation. - var size = (((source.length - psz) * FACTOR) + 1) >>> 0 // log(58) / log(256), rounded up. - var b256 = new Uint8Array(size) - // Process the characters. - while (source[psz]) { - // Decode character - var carry = BASE_MAP[source.charCodeAt(psz)] - // Invalid character - if (carry === 255) { return } - var i = 0 - for (var it3 = size - 1; (carry !== 0 || i < length) && (it3 !== -1); it3--, i++) { - carry += (BASE * b256[it3]) >>> 0 - b256[it3] = (carry % 256) >>> 0 - carry = (carry / 256) >>> 0 - } - if (carry !== 0) { throw new Error('Non-zero carry') } - length = i - psz++ - } - // Skip trailing spaces. - if (source[psz] === ' ') { return } - // Skip leading zeroes in b256. - var it4 = size - length - while (it4 !== size && b256[it4] === 0) { - it4++ - } - var vch = _Buffer.allocUnsafe(zeroes + (size - it4)) - vch.fill(0x00, 0, zeroes) - var j = zeroes - while (it4 !== size) { - vch[j++] = b256[it4++] - } - return vch - } - function decode (string) { - var buffer = decodeUnsafe(string) - if (buffer) { return buffer } - throw new Error('Non-base' + BASE + ' character') - } - return { - encode: encode, - decodeUnsafe: decodeUnsafe, - decode: decode - } -} -module.exports = base - -},{"safe-buffer":"Wugr"}],"GtuF":[function(require,module,exports) { -var basex = require('base-x') -var ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' - -module.exports = basex(ALPHABET) - -},{"base-x":"g2zT"}],"XHF5":[function(require,module,exports) { - -'use strict' - -var base58 = require('bs58') -var Buffer = require('safe-buffer').Buffer - -module.exports = function (checksumFn) { - // Encode a buffer as a base58-check encoded string - function encode (payload) { - var checksum = checksumFn(payload) - - return base58.encode(Buffer.concat([ - payload, - checksum - ], payload.length + 4)) - } - - function decodeRaw (buffer) { - var payload = buffer.slice(0, -4) - var checksum = buffer.slice(-4) - var newChecksum = checksumFn(payload) - - if (checksum[0] ^ newChecksum[0] | - checksum[1] ^ newChecksum[1] | - checksum[2] ^ newChecksum[2] | - checksum[3] ^ newChecksum[3]) return - - return payload - } - - // Decode a base58-check encoded string to a buffer, no result if checksum is wrong - function decodeUnsafe (string) { - var buffer = base58.decodeUnsafe(string) - if (!buffer) return - - return decodeRaw(buffer) - } - - function decode (string) { - var buffer = base58.decode(string) - var payload = decodeRaw(buffer, checksumFn) - if (!payload) throw new Error('Invalid checksum') - return payload - } - - return { - encode: encode, - decode: decode, - decodeUnsafe: decodeUnsafe - } -} - -},{"bs58":"GtuF","safe-buffer":"Wugr"}],"lJVR":[function(require,module,exports) { -'use strict' - -var createHash = require('create-hash') -var bs58checkBase = require('./base') - -// SHA256(SHA256(buffer)) -function sha256x2 (buffer) { - var tmp = createHash('sha256').update(buffer).digest() - return createHash('sha256').update(tmp).digest() -} - -module.exports = bs58checkBase(sha256x2) - -},{"create-hash":"LF8r","./base":"XHF5"}],"TM1d":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -var createHmac = require('create-hmac'); - -var ONE1 = Buffer.alloc(1, 1); -var ZERO1 = Buffer.alloc(1, 0); // https://tools.ietf.org/html/rfc6979#section-3.2 - -function deterministicGenerateK(hash, x, checkSig, isPrivate, extraEntropy) { - // Step A, ignored as hash already provided - // Step B - // Step C - var k = Buffer.alloc(32, 0); - var v = Buffer.alloc(32, 1); // Step D - - k = createHmac('sha256', k).update(v).update(ZERO1).update(x).update(hash).update(extraEntropy || '').digest(); // Step E - - v = createHmac('sha256', k).update(v).digest(); // Step F - - k = createHmac('sha256', k).update(v).update(ONE1).update(x).update(hash).update(extraEntropy || '').digest(); // Step G - - v = createHmac('sha256', k).update(v).digest(); // Step H1/H2a, ignored as tlen === qlen (256 bit) - // Step H2b - - v = createHmac('sha256', k).update(v).digest(); - var T = v; // Step H3, repeat until T is within the interval [1, n - 1] and is suitable for ECDSA - - while (!isPrivate(T) || !checkSig(T)) { - k = createHmac('sha256', k).update(v).update(ZERO1).digest(); - v = createHmac('sha256', k).update(v).digest(); // Step H1/H2a, again, ignored as tlen === qlen (256 bit) - // Step H2b again - - v = createHmac('sha256', k).update(v).digest(); - T = v; - } - - return T; -} - -module.exports = deterministicGenerateK; -},{"create-hmac":"Cx6S","buffer":"dskh"}],"fCMY":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -var BN = require('bn.js'); - -var EC = require('elliptic').ec; - -var secp256k1 = new EC('secp256k1'); - -var deterministicGenerateK = require('./rfc6979'); - -var ZERO32 = Buffer.alloc(32, 0); -var EC_GROUP_ORDER = Buffer.from('fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141', 'hex'); -var EC_P = Buffer.from('fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f', 'hex'); -var n = secp256k1.curve.n; -var nDiv2 = n.shrn(1); -var G = secp256k1.curve.g; -var THROW_BAD_PRIVATE = 'Expected Private'; -var THROW_BAD_POINT = 'Expected Point'; -var THROW_BAD_TWEAK = 'Expected Tweak'; -var THROW_BAD_HASH = 'Expected Hash'; -var THROW_BAD_SIGNATURE = 'Expected Signature'; -var THROW_BAD_EXTRA_DATA = 'Expected Extra Data (32 bytes)'; - -function isScalar(x) { - return Buffer.isBuffer(x) && x.length === 32; -} - -function isOrderScalar(x) { - if (!isScalar(x)) return false; - return x.compare(EC_GROUP_ORDER) < 0; // < G -} - -function isPoint(p) { - if (!Buffer.isBuffer(p)) return false; - if (p.length < 33) return false; - var t = p[0]; - var x = p.slice(1, 33); - if (x.compare(ZERO32) === 0) return false; - if (x.compare(EC_P) >= 0) return false; - - if ((t === 0x02 || t === 0x03) && p.length === 33) { - try { - decodeFrom(p); - } catch (e) { - return false; - } // TODO: temporary - - - return true; - } - - var y = p.slice(33); - if (y.compare(ZERO32) === 0) return false; - if (y.compare(EC_P) >= 0) return false; - if (t === 0x04 && p.length === 65) return true; - return false; -} - -function __isPointCompressed(p) { - return p[0] !== 0x04; -} - -function isPointCompressed(p) { - if (!isPoint(p)) return false; - return __isPointCompressed(p); -} - -function isPrivate(x) { - if (!isScalar(x)) return false; - return x.compare(ZERO32) > 0 && // > 0 - x.compare(EC_GROUP_ORDER) < 0; // < G -} - -function isSignature(value) { - var r = value.slice(0, 32); - var s = value.slice(32, 64); - return Buffer.isBuffer(value) && value.length === 64 && r.compare(EC_GROUP_ORDER) < 0 && s.compare(EC_GROUP_ORDER) < 0; -} - -function assumeCompression(value, pubkey) { - if (value === undefined && pubkey !== undefined) return __isPointCompressed(pubkey); - if (value === undefined) return true; - return value; -} - -function fromBuffer(d) { - return new BN(d); -} - -function toBuffer(d) { - return d.toArrayLike(Buffer, 'be', 32); -} - -function decodeFrom(P) { - return secp256k1.curve.decodePoint(P); -} - -function getEncoded(P, compressed) { - return Buffer.from(P._encode(compressed)); -} - -function pointAdd(pA, pB, __compressed) { - if (!isPoint(pA)) throw new TypeError(THROW_BAD_POINT); - if (!isPoint(pB)) throw new TypeError(THROW_BAD_POINT); - var a = decodeFrom(pA); - var b = decodeFrom(pB); - var pp = a.add(b); - if (pp.isInfinity()) return null; - var compressed = assumeCompression(__compressed, pA); - return getEncoded(pp, compressed); -} - -function pointAddScalar(p, tweak, __compressed) { - if (!isPoint(p)) throw new TypeError(THROW_BAD_POINT); - if (!isOrderScalar(tweak)) throw new TypeError(THROW_BAD_TWEAK); - var compressed = assumeCompression(__compressed, p); - var pp = decodeFrom(p); - if (tweak.compare(ZERO32) === 0) return getEncoded(pp, compressed); - var tt = fromBuffer(tweak); - var qq = G.mul(tt); - var uu = pp.add(qq); - if (uu.isInfinity()) return null; - return getEncoded(uu, compressed); -} - -function pointCompress(p, compressed) { - if (!isPoint(p)) throw new TypeError(THROW_BAD_POINT); - var pp = decodeFrom(p); - if (pp.isInfinity()) throw new TypeError(THROW_BAD_POINT); - return getEncoded(pp, compressed); -} - -function pointFromScalar(d, __compressed) { - if (!isPrivate(d)) throw new TypeError(THROW_BAD_PRIVATE); - var dd = fromBuffer(d); - var pp = G.mul(dd); - if (pp.isInfinity()) return null; - var compressed = assumeCompression(__compressed); - return getEncoded(pp, compressed); -} - -function pointMultiply(p, tweak, __compressed) { - if (!isPoint(p)) throw new TypeError(THROW_BAD_POINT); - if (!isOrderScalar(tweak)) throw new TypeError(THROW_BAD_TWEAK); - var compressed = assumeCompression(__compressed, p); - var pp = decodeFrom(p); - var tt = fromBuffer(tweak); - var qq = pp.mul(tt); - if (qq.isInfinity()) return null; - return getEncoded(qq, compressed); -} - -function privateAdd(d, tweak) { - if (!isPrivate(d)) throw new TypeError(THROW_BAD_PRIVATE); - if (!isOrderScalar(tweak)) throw new TypeError(THROW_BAD_TWEAK); - var dd = fromBuffer(d); - var tt = fromBuffer(tweak); - var dt = toBuffer(dd.add(tt).umod(n)); - if (!isPrivate(dt)) return null; - return dt; -} - -function privateSub(d, tweak) { - if (!isPrivate(d)) throw new TypeError(THROW_BAD_PRIVATE); - if (!isOrderScalar(tweak)) throw new TypeError(THROW_BAD_TWEAK); - var dd = fromBuffer(d); - var tt = fromBuffer(tweak); - var dt = toBuffer(dd.sub(tt).umod(n)); - if (!isPrivate(dt)) return null; - return dt; -} - -function sign(hash, x) { - return __sign(hash, x); -} - -function signWithEntropy(hash, x, addData) { - return __sign(hash, x, addData); -} - -function __sign(hash, x, addData) { - if (!isScalar(hash)) throw new TypeError(THROW_BAD_HASH); - if (!isPrivate(x)) throw new TypeError(THROW_BAD_PRIVATE); - if (addData !== undefined && !isScalar(addData)) throw new TypeError(THROW_BAD_EXTRA_DATA); - var d = fromBuffer(x); - var e = fromBuffer(hash); - var r, s; - - var checkSig = function (k) { - var kI = fromBuffer(k); - var Q = G.mul(kI); - if (Q.isInfinity()) return false; - r = Q.x.umod(n); - if (r.isZero() === 0) return false; - s = kI.invm(n).mul(e.add(d.mul(r))).umod(n); - if (s.isZero() === 0) return false; - return true; - }; - - deterministicGenerateK(hash, x, checkSig, isPrivate, addData); // enforce low S values, see bip62: 'low s values in signatures' - - if (s.cmp(nDiv2) > 0) { - s = n.sub(s); - } - - var buffer = Buffer.allocUnsafe(64); - toBuffer(r).copy(buffer, 0); - toBuffer(s).copy(buffer, 32); - return buffer; -} - -function verify(hash, q, signature) { - if (!isScalar(hash)) throw new TypeError(THROW_BAD_HASH); - if (!isPoint(q)) throw new TypeError(THROW_BAD_POINT); // 1.4.1 Enforce r and s are both integers in the interval [1, n − 1] (1, isSignature enforces '< n - 1') - - if (!isSignature(signature)) throw new TypeError(THROW_BAD_SIGNATURE); - var Q = decodeFrom(q); - var r = fromBuffer(signature.slice(0, 32)); - var s = fromBuffer(signature.slice(32, 64)); // 1.4.1 Enforce r and s are both integers in the interval [1, n − 1] (2, enforces '> 0') - - if (r.gtn(0) <= 0 - /* || r.compareTo(n) >= 0 */ - ) return false; - if (s.gtn(0) <= 0 - /* || s.compareTo(n) >= 0 */ - ) return false; // 1.4.2 H = Hash(M), already done by the user - // 1.4.3 e = H - - var e = fromBuffer(hash); // Compute s^-1 - - var sInv = s.invm(n); // 1.4.4 Compute u1 = es^−1 mod n - // u2 = rs^−1 mod n - - var u1 = e.mul(sInv).umod(n); - var u2 = r.mul(sInv).umod(n); // 1.4.5 Compute R = (xR, yR) - // R = u1G + u2Q - - var R = G.mulAdd(u1, Q, u2); // 1.4.5 (cont.) Enforce R is not at infinity - - if (R.isInfinity()) return false; // 1.4.6 Convert the field element R.x to an integer - - var xR = R.x; // 1.4.7 Set v = xR mod n - - var v = xR.umod(n); // 1.4.8 If v = r, output "valid", and if v != r, output "invalid" - - return v.eq(r); -} - -module.exports = { - isPoint: isPoint, - isPointCompressed: isPointCompressed, - isPrivate: isPrivate, - pointAdd: pointAdd, - pointAddScalar: pointAddScalar, - pointCompress: pointCompress, - pointFromScalar: pointFromScalar, - pointMultiply: pointMultiply, - privateAdd: privateAdd, - privateSub: privateSub, - sign: sign, - signWithEntropy: signWithEntropy, - verify: verify -}; -},{"bn.js":"BOxy","elliptic":"xha3","./rfc6979":"TM1d","buffer":"dskh"}],"XRex":[function(require,module,exports) { -var types = { - Array: function (value) { return value !== null && value !== undefined && value.constructor === Array }, - Boolean: function (value) { return typeof value === 'boolean' }, - Function: function (value) { return typeof value === 'function' }, - Nil: function (value) { return value === undefined || value === null }, - Number: function (value) { return typeof value === 'number' }, - Object: function (value) { return typeof value === 'object' }, - String: function (value) { return typeof value === 'string' }, - '': function () { return true } -} - -// TODO: deprecate -types.Null = types.Nil - -for (var typeName in types) { - types[typeName].toJSON = function (t) { - return t - }.bind(null, typeName) -} - -module.exports = types - -},{}],"p5LL":[function(require,module,exports) { -var native = require('./native') - -function getTypeName (fn) { - return fn.name || fn.toString().match(/function (.*?)\s*\(/)[1] -} - -function getValueTypeName (value) { - return native.Nil(value) ? '' : getTypeName(value.constructor) -} - -function getValue (value) { - if (native.Function(value)) return '' - if (native.String(value)) return JSON.stringify(value) - if (value && native.Object(value)) return '' - return value -} - -function captureStackTrace (e, t) { - if (Error.captureStackTrace) { - Error.captureStackTrace(e, t) - } -} - -function tfJSON (type) { - if (native.Function(type)) return type.toJSON ? type.toJSON() : getTypeName(type) - if (native.Array(type)) return 'Array' - if (type && native.Object(type)) return 'Object' - - return type !== undefined ? type : '' -} - -function tfErrorString (type, value, valueTypeName) { - var valueJson = getValue(value) - - return 'Expected ' + tfJSON(type) + ', got' + - (valueTypeName !== '' ? ' ' + valueTypeName : '') + - (valueJson !== '' ? ' ' + valueJson : '') -} - -function TfTypeError (type, value, valueTypeName) { - valueTypeName = valueTypeName || getValueTypeName(value) - this.message = tfErrorString(type, value, valueTypeName) - - captureStackTrace(this, TfTypeError) - this.__type = type - this.__value = value - this.__valueTypeName = valueTypeName -} - -TfTypeError.prototype = Object.create(Error.prototype) -TfTypeError.prototype.constructor = TfTypeError - -function tfPropertyErrorString (type, label, name, value, valueTypeName) { - var description = '" of type ' - if (label === 'key') description = '" with key type ' - - return tfErrorString('property "' + tfJSON(name) + description + tfJSON(type), value, valueTypeName) -} - -function TfPropertyTypeError (type, property, label, value, valueTypeName) { - if (type) { - valueTypeName = valueTypeName || getValueTypeName(value) - this.message = tfPropertyErrorString(type, label, property, value, valueTypeName) - } else { - this.message = 'Unexpected property "' + property + '"' - } - - captureStackTrace(this, TfTypeError) - this.__label = label - this.__property = property - this.__type = type - this.__value = value - this.__valueTypeName = valueTypeName -} - -TfPropertyTypeError.prototype = Object.create(Error.prototype) -TfPropertyTypeError.prototype.constructor = TfTypeError - -function tfCustomError (expected, actual) { - return new TfTypeError(expected, {}, actual) -} - -function tfSubError (e, property, label) { - // sub child? - if (e instanceof TfPropertyTypeError) { - property = property + '.' + e.__property - - e = new TfPropertyTypeError( - e.__type, property, e.__label, e.__value, e.__valueTypeName - ) - - // child? - } else if (e instanceof TfTypeError) { - e = new TfPropertyTypeError( - e.__type, property, label, e.__value, e.__valueTypeName - ) - } - - captureStackTrace(e) - return e -} - -module.exports = { - TfTypeError: TfTypeError, - TfPropertyTypeError: TfPropertyTypeError, - tfCustomError: tfCustomError, - tfSubError: tfSubError, - tfJSON: tfJSON, - getValueTypeName: getValueTypeName -} - -},{"./native":"XRex"}],"hl3b":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -var NATIVE = require('./native') -var ERRORS = require('./errors') - -function _Buffer (value) { - return Buffer.isBuffer(value) -} - -function Hex (value) { - return typeof value === 'string' && /^([0-9a-f]{2})+$/i.test(value) -} - -function _LengthN (type, length) { - var name = type.toJSON() - - function Length (value) { - if (!type(value)) return false - if (value.length === length) return true - - throw ERRORS.tfCustomError(name + '(Length: ' + length + ')', name + '(Length: ' + value.length + ')') - } - Length.toJSON = function () { return name } - - return Length -} - -var _ArrayN = _LengthN.bind(null, NATIVE.Array) -var _BufferN = _LengthN.bind(null, _Buffer) -var _HexN = _LengthN.bind(null, Hex) -var _StringN = _LengthN.bind(null, NATIVE.String) - -function Range (a, b, f) { - f = f || NATIVE.Number - function _range (value, strict) { - return f(value, strict) && (value > a) && (value < b) - } - _range.toJSON = function () { - return `${f.toJSON()} between [${a}, ${b}]` - } - return _range -} - -var INT53_MAX = Math.pow(2, 53) - 1 - -function Finite (value) { - return typeof value === 'number' && isFinite(value) -} -function Int8 (value) { return ((value << 24) >> 24) === value } -function Int16 (value) { return ((value << 16) >> 16) === value } -function Int32 (value) { return (value | 0) === value } -function Int53 (value) { - return typeof value === 'number' && - value >= -INT53_MAX && - value <= INT53_MAX && - Math.floor(value) === value -} -function UInt8 (value) { return (value & 0xff) === value } -function UInt16 (value) { return (value & 0xffff) === value } -function UInt32 (value) { return (value >>> 0) === value } -function UInt53 (value) { - return typeof value === 'number' && - value >= 0 && - value <= INT53_MAX && - Math.floor(value) === value -} - -var types = { - ArrayN: _ArrayN, - Buffer: _Buffer, - BufferN: _BufferN, - Finite: Finite, - Hex: Hex, - HexN: _HexN, - Int8: Int8, - Int16: Int16, - Int32: Int32, - Int53: Int53, - Range: Range, - StringN: _StringN, - UInt8: UInt8, - UInt16: UInt16, - UInt32: UInt32, - UInt53: UInt53 -} - -for (var typeName in types) { - types[typeName].toJSON = function (t) { - return t - }.bind(null, typeName) -} - -module.exports = types - -},{"./native":"XRex","./errors":"p5LL","buffer":"dskh"}],"PKU7":[function(require,module,exports) { -var ERRORS = require('./errors') -var NATIVE = require('./native') - -// short-hand -var tfJSON = ERRORS.tfJSON -var TfTypeError = ERRORS.TfTypeError -var TfPropertyTypeError = ERRORS.TfPropertyTypeError -var tfSubError = ERRORS.tfSubError -var getValueTypeName = ERRORS.getValueTypeName - -var TYPES = { - arrayOf: function arrayOf (type, options) { - type = compile(type) - options = options || {} - - function _arrayOf (array, strict) { - if (!NATIVE.Array(array)) return false - if (NATIVE.Nil(array)) return false - if (options.minLength !== undefined && array.length < options.minLength) return false - if (options.maxLength !== undefined && array.length > options.maxLength) return false - if (options.length !== undefined && array.length !== options.length) return false - - return array.every(function (value, i) { - try { - return typeforce(type, value, strict) - } catch (e) { - throw tfSubError(e, i) - } - }) - } - _arrayOf.toJSON = function () { - var str = '[' + tfJSON(type) + ']' - if (options.length !== undefined) { - str += '{' + options.length + '}' - } else if (options.minLength !== undefined || options.maxLength !== undefined) { - str += '{' + - (options.minLength === undefined ? 0 : options.minLength) + ',' + - (options.maxLength === undefined ? Infinity : options.maxLength) + '}' - } - return str - } - - return _arrayOf - }, - - maybe: function maybe (type) { - type = compile(type) - - function _maybe (value, strict) { - return NATIVE.Nil(value) || type(value, strict, maybe) - } - _maybe.toJSON = function () { return '?' + tfJSON(type) } - - return _maybe - }, - - map: function map (propertyType, propertyKeyType) { - propertyType = compile(propertyType) - if (propertyKeyType) propertyKeyType = compile(propertyKeyType) - - function _map (value, strict) { - if (!NATIVE.Object(value)) return false - if (NATIVE.Nil(value)) return false - - for (var propertyName in value) { - try { - if (propertyKeyType) { - typeforce(propertyKeyType, propertyName, strict) - } - } catch (e) { - throw tfSubError(e, propertyName, 'key') - } - - try { - var propertyValue = value[propertyName] - typeforce(propertyType, propertyValue, strict) - } catch (e) { - throw tfSubError(e, propertyName) - } - } - - return true - } - - if (propertyKeyType) { - _map.toJSON = function () { - return '{' + tfJSON(propertyKeyType) + ': ' + tfJSON(propertyType) + '}' - } - } else { - _map.toJSON = function () { return '{' + tfJSON(propertyType) + '}' } - } - - return _map - }, - - object: function object (uncompiled) { - var type = {} - - for (var typePropertyName in uncompiled) { - type[typePropertyName] = compile(uncompiled[typePropertyName]) - } - - function _object (value, strict) { - if (!NATIVE.Object(value)) return false - if (NATIVE.Nil(value)) return false - - var propertyName - - try { - for (propertyName in type) { - var propertyType = type[propertyName] - var propertyValue = value[propertyName] - - typeforce(propertyType, propertyValue, strict) - } - } catch (e) { - throw tfSubError(e, propertyName) - } - - if (strict) { - for (propertyName in value) { - if (type[propertyName]) continue - - throw new TfPropertyTypeError(undefined, propertyName) - } - } - - return true - } - _object.toJSON = function () { return tfJSON(type) } - - return _object - }, - - anyOf: function anyOf () { - var types = [].slice.call(arguments).map(compile) - - function _anyOf (value, strict) { - return types.some(function (type) { - try { - return typeforce(type, value, strict) - } catch (e) { - return false - } - }) - } - _anyOf.toJSON = function () { return types.map(tfJSON).join('|') } - - return _anyOf - }, - - allOf: function allOf () { - var types = [].slice.call(arguments).map(compile) - - function _allOf (value, strict) { - return types.every(function (type) { - try { - return typeforce(type, value, strict) - } catch (e) { - return false - } - }) - } - _allOf.toJSON = function () { return types.map(tfJSON).join(' & ') } - - return _allOf - }, - - quacksLike: function quacksLike (type) { - function _quacksLike (value) { - return type === getValueTypeName(value) - } - _quacksLike.toJSON = function () { return type } - - return _quacksLike - }, - - tuple: function tuple () { - var types = [].slice.call(arguments).map(compile) - - function _tuple (values, strict) { - if (NATIVE.Nil(values)) return false - if (NATIVE.Nil(values.length)) return false - if (strict && (values.length !== types.length)) return false - - return types.every(function (type, i) { - try { - return typeforce(type, values[i], strict) - } catch (e) { - throw tfSubError(e, i) - } - }) - } - _tuple.toJSON = function () { return '(' + types.map(tfJSON).join(', ') + ')' } - - return _tuple - }, - - value: function value (expected) { - function _value (actual) { - return actual === expected - } - _value.toJSON = function () { return expected } - - return _value - } -} - -// TODO: deprecate -TYPES.oneOf = TYPES.anyOf - -function compile (type) { - if (NATIVE.String(type)) { - if (type[0] === '?') return TYPES.maybe(type.slice(1)) - - return NATIVE[type] || TYPES.quacksLike(type) - } else if (type && NATIVE.Object(type)) { - if (NATIVE.Array(type)) { - if (type.length !== 1) throw new TypeError('Expected compile() parameter of type Array of length 1') - return TYPES.arrayOf(type[0]) - } - - return TYPES.object(type) - } else if (NATIVE.Function(type)) { - return type - } - - return TYPES.value(type) -} - -function typeforce (type, value, strict, surrogate) { - if (NATIVE.Function(type)) { - if (type(value, strict)) return true - - throw new TfTypeError(surrogate || type, value) - } - - // JIT - return typeforce(compile(type), value, strict) -} - -// assign types to typeforce function -for (var typeName in NATIVE) { - typeforce[typeName] = NATIVE[typeName] -} - -for (typeName in TYPES) { - typeforce[typeName] = TYPES[typeName] -} - -var EXTRA = require('./extra') -for (typeName in EXTRA) { - typeforce[typeName] = EXTRA[typeName] -} - -typeforce.compile = compile -typeforce.TfTypeError = TfTypeError -typeforce.TfPropertyTypeError = TfPropertyTypeError - -module.exports = typeforce - -},{"./errors":"p5LL","./native":"XRex","./extra":"hl3b"}],"zCNS":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -var bs58check = require('bs58check') - -function decodeRaw (buffer, version) { - // check version only if defined - if (version !== undefined && buffer[0] !== version) throw new Error('Invalid network version') - - // uncompressed - if (buffer.length === 33) { - return { - version: buffer[0], - privateKey: buffer.slice(1, 33), - compressed: false - } - } - - // invalid length - if (buffer.length !== 34) throw new Error('Invalid WIF length') - - // invalid compression flag - if (buffer[33] !== 0x01) throw new Error('Invalid compression flag') - - return { - version: buffer[0], - privateKey: buffer.slice(1, 33), - compressed: true - } -} - -function encodeRaw (version, privateKey, compressed) { - var result = new Buffer(compressed ? 34 : 33) - - result.writeUInt8(version, 0) - privateKey.copy(result, 1) - - if (compressed) { - result[33] = 0x01 - } - - return result -} - -function decode (string, version) { - return decodeRaw(bs58check.decode(string), version) -} - -function encode (version, privateKey, compressed) { - if (typeof version === 'number') return bs58check.encode(encodeRaw(version, privateKey, compressed)) - - return bs58check.encode( - encodeRaw( - version.version, - version.privateKey, - version.compressed - ) - ) -} - -module.exports = { - decode: decode, - decodeRaw: decodeRaw, - encode: encode, - encodeRaw: encodeRaw -} - -},{"bs58check":"lJVR","buffer":"dskh"}],"iQbK":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -"use strict"; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var crypto = require("./crypto"); - -var bs58check = require('bs58check'); - -var ecc = require('tiny-secp256k1'); - -var typeforce = require('typeforce'); - -var wif = require('wif'); - -var UINT256_TYPE = typeforce.BufferN(32); -var NETWORK_TYPE = typeforce.compile({ - wif: typeforce.UInt8, - bip32: { - public: typeforce.UInt32, - private: typeforce.UInt32 - } -}); -var BITCOIN = { - wif: 0x80, - bip32: { - public: 0x0488b21e, - private: 0x0488ade4 - } -}; -var HIGHEST_BIT = 0x80000000; -var UINT31_MAX = Math.pow(2, 31) - 1; - -function BIP32Path(value) { - return typeforce.String(value) && value.match(/^(m\/)?(\d+'?\/)*\d+'?$/) !== null; -} - -function UInt31(value) { - return typeforce.UInt32(value) && value <= UINT31_MAX; -} - -var BIP32 = -/*#__PURE__*/ -function () { - function BIP32(__D, __Q, chainCode, network) { - var __DEPTH = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0; - - var __INDEX = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; - - var __PARENT_FINGERPRINT = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 0x00000000; - - _classCallCheck(this, BIP32); - - this.__D = __D; - this.__Q = __Q; - this.chainCode = chainCode; - this.network = network; - this.__DEPTH = __DEPTH; - this.__INDEX = __INDEX; - this.__PARENT_FINGERPRINT = __PARENT_FINGERPRINT; - typeforce(NETWORK_TYPE, network); - this.lowR = false; - } - - _createClass(BIP32, [{ - key: "isNeutered", - // Private === not neutered - // Public === neutered - value: function isNeutered() { - return this.__D === undefined; - } - }, { - key: "neutered", - value: function neutered() { - return fromPublicKeyLocal(this.publicKey, this.chainCode, this.network, this.depth, this.index, this.parentFingerprint); - } - }, { - key: "toBase58", - value: function toBase58() { - var network = this.network; - var version = !this.isNeutered() ? network.bip32.private : network.bip32.public; - var buffer = Buffer.allocUnsafe(78); // 4 bytes: version bytes - - buffer.writeUInt32BE(version, 0); // 1 byte: depth: 0x00 for master nodes, 0x01 for level-1 descendants, .... - - buffer.writeUInt8(this.depth, 4); // 4 bytes: the fingerprint of the parent's key (0x00000000 if master key) - - buffer.writeUInt32BE(this.parentFingerprint, 5); // 4 bytes: child number. This is the number i in xi = xpar/i, with xi the key being serialized. - // This is encoded in big endian. (0x00000000 if master key) - - buffer.writeUInt32BE(this.index, 9); // 32 bytes: the chain code - - this.chainCode.copy(buffer, 13); // 33 bytes: the public key or private key data - - if (!this.isNeutered()) { - // 0x00 + k for private keys - buffer.writeUInt8(0, 45); - this.privateKey.copy(buffer, 46); // 33 bytes: the public key - } else { - // X9.62 encoding for public keys - this.publicKey.copy(buffer, 45); - } - - return bs58check.encode(buffer); - } - }, { - key: "toWIF", - value: function toWIF() { - if (!this.privateKey) throw new TypeError('Missing private key'); - return wif.encode(this.network.wif, this.privateKey, true); - } // https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#child-key-derivation-ckd-functions - - }, { - key: "derive", - value: function derive(index) { - typeforce(typeforce.UInt32, index); - var isHardened = index >= HIGHEST_BIT; - var data = Buffer.allocUnsafe(37); // Hardened child - - if (isHardened) { - if (this.isNeutered()) throw new TypeError('Missing private key for hardened child key'); // data = 0x00 || ser256(kpar) || ser32(index) - - data[0] = 0x00; - this.privateKey.copy(data, 1); - data.writeUInt32BE(index, 33); // Normal child - } else { - // data = serP(point(kpar)) || ser32(index) - // = serP(Kpar) || ser32(index) - this.publicKey.copy(data, 0); - data.writeUInt32BE(index, 33); - } - - var I = crypto.hmacSHA512(this.chainCode, data); - var IL = I.slice(0, 32); - var IR = I.slice(32); // if parse256(IL) >= n, proceed with the next value for i - - if (!ecc.isPrivate(IL)) return this.derive(index + 1); // Private parent key -> private child key - - var hd; - - if (!this.isNeutered()) { - // ki = parse256(IL) + kpar (mod n) - var ki = ecc.privateAdd(this.privateKey, IL); // In case ki == 0, proceed with the next value for i - - if (ki == null) return this.derive(index + 1); - hd = fromPrivateKeyLocal(ki, IR, this.network, this.depth + 1, index, this.fingerprint.readUInt32BE(0)); // Public parent key -> public child key - } else { - // Ki = point(parse256(IL)) + Kpar - // = G*IL + Kpar - var Ki = ecc.pointAddScalar(this.publicKey, IL, true); // In case Ki is the point at infinity, proceed with the next value for i - - if (Ki === null) return this.derive(index + 1); - hd = fromPublicKeyLocal(Ki, IR, this.network, this.depth + 1, index, this.fingerprint.readUInt32BE(0)); - } - - return hd; - } - }, { - key: "deriveHardened", - value: function deriveHardened(index) { - typeforce(UInt31, index); // Only derives hardened private keys by default - - return this.derive(index + HIGHEST_BIT); - } - }, { - key: "derivePath", - value: function derivePath(path) { - typeforce(BIP32Path, path); - var splitPath = path.split('/'); - - if (splitPath[0] === 'm') { - if (this.parentFingerprint) throw new TypeError('Expected master, got child'); - splitPath = splitPath.slice(1); - } - - return splitPath.reduce(function (prevHd, indexStr) { - var index; - - if (indexStr.slice(-1) === "'") { - index = parseInt(indexStr.slice(0, -1), 10); - return prevHd.deriveHardened(index); - } else { - index = parseInt(indexStr, 10); - return prevHd.derive(index); - } - }, this); - } - }, { - key: "sign", - value: function sign(hash, lowR) { - if (!this.privateKey) throw new Error('Missing private key'); - if (lowR === undefined) lowR = this.lowR; - - if (lowR === false) { - return ecc.sign(hash, this.privateKey); - } else { - var sig = ecc.sign(hash, this.privateKey); - var extraData = Buffer.alloc(32, 0); - var counter = 0; // if first try is lowR, skip the loop - // for second try and on, add extra entropy counting up - - while (sig[0] > 0x7f) { - counter++; - extraData.writeUIntLE(counter, 0, 6); - sig = ecc.signWithEntropy(hash, this.privateKey, extraData); - } - - return sig; - } - } - }, { - key: "verify", - value: function verify(hash, signature) { - return ecc.verify(hash, this.publicKey, signature); - } - }, { - key: "depth", - get: function () { - return this.__DEPTH; - } - }, { - key: "index", - get: function () { - return this.__INDEX; - } - }, { - key: "parentFingerprint", - get: function () { - return this.__PARENT_FINGERPRINT; - } - }, { - key: "publicKey", - get: function () { - if (this.__Q === undefined) this.__Q = ecc.pointFromScalar(this.__D, true); - return this.__Q; - } - }, { - key: "privateKey", - get: function () { - return this.__D; - } - }, { - key: "identifier", - get: function () { - return crypto.hash160(this.publicKey); - } - }, { - key: "fingerprint", - get: function () { - return this.identifier.slice(0, 4); - } - }]); - - return BIP32; -}(); - -function fromBase58(inString, network) { - var buffer = bs58check.decode(inString); - if (buffer.length !== 78) throw new TypeError('Invalid buffer length'); - network = network || BITCOIN; // 4 bytes: version bytes - - var version = buffer.readUInt32BE(0); - if (version !== network.bip32.private && version !== network.bip32.public) throw new TypeError('Invalid network version'); // 1 byte: depth: 0x00 for master nodes, 0x01 for level-1 descendants, ... - - var depth = buffer[4]; // 4 bytes: the fingerprint of the parent's key (0x00000000 if master key) - - var parentFingerprint = buffer.readUInt32BE(5); - - if (depth === 0) { - if (parentFingerprint !== 0x00000000) throw new TypeError('Invalid parent fingerprint'); - } // 4 bytes: child number. This is the number i in xi = xpar/i, with xi the key being serialized. - // This is encoded in MSB order. (0x00000000 if master key) - - - var index = buffer.readUInt32BE(9); - if (depth === 0 && index !== 0) throw new TypeError('Invalid index'); // 32 bytes: the chain code - - var chainCode = buffer.slice(13, 45); - var hd; // 33 bytes: private key data (0x00 + k) - - if (version === network.bip32.private) { - if (buffer.readUInt8(45) !== 0x00) throw new TypeError('Invalid private key'); - var k = buffer.slice(46, 78); - hd = fromPrivateKeyLocal(k, chainCode, network, depth, index, parentFingerprint); // 33 bytes: public key data (0x02 + X or 0x03 + X) - } else { - var X = buffer.slice(45, 78); - hd = fromPublicKeyLocal(X, chainCode, network, depth, index, parentFingerprint); - } - - return hd; -} - -exports.fromBase58 = fromBase58; - -function fromPrivateKey(privateKey, chainCode, network) { - return fromPrivateKeyLocal(privateKey, chainCode, network); -} - -exports.fromPrivateKey = fromPrivateKey; - -function fromPrivateKeyLocal(privateKey, chainCode, network, depth, index, parentFingerprint) { - typeforce({ - privateKey: UINT256_TYPE, - chainCode: UINT256_TYPE - }, { - privateKey: privateKey, - chainCode: chainCode - }); - network = network || BITCOIN; - if (!ecc.isPrivate(privateKey)) throw new TypeError('Private key not in range [1, n)'); - return new BIP32(privateKey, undefined, chainCode, network, depth, index, parentFingerprint); -} - -function fromPublicKey(publicKey, chainCode, network) { - return fromPublicKeyLocal(publicKey, chainCode, network); -} - -exports.fromPublicKey = fromPublicKey; - -function fromPublicKeyLocal(publicKey, chainCode, network, depth, index, parentFingerprint) { - typeforce({ - publicKey: typeforce.BufferN(33), - chainCode: UINT256_TYPE - }, { - publicKey: publicKey, - chainCode: chainCode - }); - network = network || BITCOIN; // verify the X coordinate is a point on the curve - - if (!ecc.isPoint(publicKey)) throw new TypeError('Point is not on the curve'); - return new BIP32(undefined, publicKey, chainCode, network, depth, index, parentFingerprint); -} - -function fromSeed(seed, network) { - typeforce(typeforce.Buffer, seed); - if (seed.length < 16) throw new TypeError('Seed should be at least 128 bits'); - if (seed.length > 64) throw new TypeError('Seed should be at most 512 bits'); - network = network || BITCOIN; - var I = crypto.hmacSHA512(Buffer.from('Bitcoin seed', 'utf8'), seed); - var IL = I.slice(0, 32); - var IR = I.slice(32); - return fromPrivateKey(IL, IR, network); -} - -exports.fromSeed = fromSeed; -},{"./crypto":"V9ao","bs58check":"lJVR","tiny-secp256k1":"fCMY","typeforce":"PKU7","wif":"zCNS","buffer":"dskh"}],"pelw":[function(require,module,exports) { -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var bip32_1 = require("./bip32"); - -exports.fromSeed = bip32_1.fromSeed; -exports.fromBase58 = bip32_1.fromBase58; -exports.fromPublicKey = bip32_1.fromPublicKey; -exports.fromPrivateKey = bip32_1.fromPrivateKey; -},{"./bip32":"iQbK"}],"rvS6":[function(require,module,exports) { -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); -exports.bitcoin = { - messagePrefix: '\x18Bitcoin Signed Message:\n', - bech32: 'bc', - bip32: { - public: 0x0488b21e, - private: 0x0488ade4 - }, - pubKeyHash: 0x00, - scriptHash: 0x05, - wif: 0x80 -}; -exports.regtest = { - messagePrefix: '\x18Bitcoin Signed Message:\n', - bech32: 'bcrt', - bip32: { - public: 0x043587cf, - private: 0x04358394 - }, - pubKeyHash: 0x6f, - scriptHash: 0xc4, - wif: 0xef -}; -exports.testnet = { - messagePrefix: '\x18Bitcoin Signed Message:\n', - bech32: 'tb', - bip32: { - public: 0x043587cf, - private: 0x04358394 - }, - pubKeyHash: 0x6f, - scriptHash: 0xc4, - wif: 0xef -}; -},{}],"P3Rn":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -function decode(buffer, maxLength, minimal) { - maxLength = maxLength || 4; - minimal = minimal === undefined ? true : minimal; - var length = buffer.length; - if (length === 0) return 0; - if (length > maxLength) throw new TypeError('Script number overflow'); - - if (minimal) { - if ((buffer[length - 1] & 0x7f) === 0) { - if (length <= 1 || (buffer[length - 2] & 0x80) === 0) throw new Error('Non-minimally encoded script number'); - } - } // 40-bit - - - if (length === 5) { - var a = buffer.readUInt32LE(0); - var b = buffer.readUInt8(4); - if (b & 0x80) return -((b & ~0x80) * 0x100000000 + a); - return b * 0x100000000 + a; - } // 32-bit / 24-bit / 16-bit / 8-bit - - - var result = 0; - - for (var i = 0; i < length; ++i) { - result |= buffer[i] << 8 * i; - } - - if (buffer[length - 1] & 0x80) return -(result & ~(0x80 << 8 * (length - 1))); - return result; -} - -exports.decode = decode; - -function scriptNumSize(i) { - return i > 0x7fffffff ? 5 : i > 0x7fffff ? 4 : i > 0x7fff ? 3 : i > 0x7f ? 2 : i > 0x00 ? 1 : 0; -} - -function encode(_number) { - var value = Math.abs(_number); - var size = scriptNumSize(value); - var buffer = Buffer.allocUnsafe(size); - var negative = _number < 0; - - for (var i = 0; i < size; ++i) { - buffer.writeUInt8(value & 0xff, i); - value >>= 8; - } - - if (buffer[size - 1] & 0x80) { - buffer.writeUInt8(negative ? 0x80 : 0x00, size - 1); - } else if (negative) { - buffer[size - 1] |= 0x80; - } - - return buffer; -} - -exports.encode = encode; -},{"buffer":"dskh"}],"TQ2w":[function(require,module,exports) { -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var typeforce = require('typeforce'); - -var UINT31_MAX = Math.pow(2, 31) - 1; - -function UInt31(value) { - return typeforce.UInt32(value) && value <= UINT31_MAX; -} - -exports.UInt31 = UInt31; - -function BIP32Path(value) { - return typeforce.String(value) && !!value.match(/^(m\/)?(\d+'?\/)*\d+'?$/); -} - -exports.BIP32Path = BIP32Path; - -BIP32Path.toJSON = function () { - return 'BIP32 derivation path'; -}; - -function Signer(obj) { - return (typeforce.Buffer(obj.publicKey) || typeof obj.getPublicKey === 'function') && typeof obj.sign === 'function'; -} - -exports.Signer = Signer; -var SATOSHI_MAX = 21 * 1e14; - -function Satoshi(value) { - return typeforce.UInt53(value) && value <= SATOSHI_MAX; -} - -exports.Satoshi = Satoshi; // external dependent types - -exports.ECPoint = typeforce.quacksLike('Point'); // exposed, external API - -exports.Network = typeforce.compile({ - messagePrefix: typeforce.oneOf(typeforce.Buffer, typeforce.String), - bip32: { - public: typeforce.UInt32, - private: typeforce.UInt32 - }, - pubKeyHash: typeforce.UInt8, - scriptHash: typeforce.UInt8, - wif: typeforce.UInt8 -}); -exports.Buffer256bit = typeforce.BufferN(32); -exports.Hash160bit = typeforce.BufferN(20); -exports.Hash256bit = typeforce.BufferN(32); -exports.Number = typeforce.Number; // tslint:disable-line variable-name - -exports.Array = typeforce.Array; -exports.Boolean = typeforce.Boolean; // tslint:disable-line variable-name - -exports.String = typeforce.String; // tslint:disable-line variable-name - -exports.Buffer = typeforce.Buffer; -exports.Hex = typeforce.Hex; -exports.maybe = typeforce.maybe; -exports.tuple = typeforce.tuple; -exports.UInt8 = typeforce.UInt8; -exports.UInt32 = typeforce.UInt32; -exports.Function = typeforce.Function; -exports.BufferN = typeforce.BufferN; -exports.Null = typeforce.Null; -exports.oneOf = typeforce.oneOf; -},{"typeforce":"PKU7"}],"qbEO":[function(require,module,exports) { - -// Reference https://github.com/bitcoin/bips/blob/master/bip-0066.mediawiki -// Format: 0x30 [total-length] 0x02 [R-length] [R] 0x02 [S-length] [S] -// NOTE: SIGHASH byte ignored AND restricted, truncate before use - -var Buffer = require('safe-buffer').Buffer - -function check (buffer) { - if (buffer.length < 8) return false - if (buffer.length > 72) return false - if (buffer[0] !== 0x30) return false - if (buffer[1] !== buffer.length - 2) return false - if (buffer[2] !== 0x02) return false - - var lenR = buffer[3] - if (lenR === 0) return false - if (5 + lenR >= buffer.length) return false - if (buffer[4 + lenR] !== 0x02) return false - - var lenS = buffer[5 + lenR] - if (lenS === 0) return false - if ((6 + lenR + lenS) !== buffer.length) return false - - if (buffer[4] & 0x80) return false - if (lenR > 1 && (buffer[4] === 0x00) && !(buffer[5] & 0x80)) return false - - if (buffer[lenR + 6] & 0x80) return false - if (lenS > 1 && (buffer[lenR + 6] === 0x00) && !(buffer[lenR + 7] & 0x80)) return false - return true -} - -function decode (buffer) { - if (buffer.length < 8) throw new Error('DER sequence length is too short') - if (buffer.length > 72) throw new Error('DER sequence length is too long') - if (buffer[0] !== 0x30) throw new Error('Expected DER sequence') - if (buffer[1] !== buffer.length - 2) throw new Error('DER sequence length is invalid') - if (buffer[2] !== 0x02) throw new Error('Expected DER integer') - - var lenR = buffer[3] - if (lenR === 0) throw new Error('R length is zero') - if (5 + lenR >= buffer.length) throw new Error('R length is too long') - if (buffer[4 + lenR] !== 0x02) throw new Error('Expected DER integer (2)') - - var lenS = buffer[5 + lenR] - if (lenS === 0) throw new Error('S length is zero') - if ((6 + lenR + lenS) !== buffer.length) throw new Error('S length is invalid') - - if (buffer[4] & 0x80) throw new Error('R value is negative') - if (lenR > 1 && (buffer[4] === 0x00) && !(buffer[5] & 0x80)) throw new Error('R value excessively padded') - - if (buffer[lenR + 6] & 0x80) throw new Error('S value is negative') - if (lenS > 1 && (buffer[lenR + 6] === 0x00) && !(buffer[lenR + 7] & 0x80)) throw new Error('S value excessively padded') - - // non-BIP66 - extract R, S values - return { - r: buffer.slice(4, 4 + lenR), - s: buffer.slice(6 + lenR) - } -} - -/* - * Expects r and s to be positive DER integers. - * - * The DER format uses the most significant bit as a sign bit (& 0x80). - * If the significant bit is set AND the integer is positive, a 0x00 is prepended. - * - * Examples: - * - * 0 => 0x00 - * 1 => 0x01 - * -1 => 0xff - * 127 => 0x7f - * -127 => 0x81 - * 128 => 0x0080 - * -128 => 0x80 - * 255 => 0x00ff - * -255 => 0xff01 - * 16300 => 0x3fac - * -16300 => 0xc054 - * 62300 => 0x00f35c - * -62300 => 0xff0ca4 -*/ -function encode (r, s) { - var lenR = r.length - var lenS = s.length - if (lenR === 0) throw new Error('R length is zero') - if (lenS === 0) throw new Error('S length is zero') - if (lenR > 33) throw new Error('R length is too long') - if (lenS > 33) throw new Error('S length is too long') - if (r[0] & 0x80) throw new Error('R value is negative') - if (s[0] & 0x80) throw new Error('S value is negative') - if (lenR > 1 && (r[0] === 0x00) && !(r[1] & 0x80)) throw new Error('R value excessively padded') - if (lenS > 1 && (s[0] === 0x00) && !(s[1] & 0x80)) throw new Error('S value excessively padded') - - var signature = Buffer.allocUnsafe(6 + lenR + lenS) - - // 0x30 [total-length] 0x02 [R-length] [R] 0x02 [S-length] [S] - signature[0] = 0x30 - signature[1] = signature.length - 2 - signature[2] = 0x02 - signature[3] = r.length - r.copy(signature, 4) - signature[4 + lenR] = 0x02 - signature[5 + lenR] = s.length - s.copy(signature, 6 + lenR) - - return signature -} - -module.exports = { - check: check, - decode: decode, - encode: encode -} - -},{"safe-buffer":"Wugr"}],"d9co":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var types = require('./types'); - -var bip66 = require('bip66'); - -var typeforce = require('typeforce'); - -var ZERO = Buffer.alloc(1, 0); - -function toDER(x) { - var i = 0; - - while (x[i] === 0) { - ++i; - } - - if (i === x.length) return ZERO; - x = x.slice(i); - if (x[0] & 0x80) return Buffer.concat([ZERO, x], 1 + x.length); - return x; -} - -function fromDER(x) { - if (x[0] === 0x00) x = x.slice(1); - var buffer = Buffer.alloc(32, 0); - var bstart = Math.max(0, 32 - x.length); - x.copy(buffer, bstart); - return buffer; -} // BIP62: 1 byte hashType flag (only 0x01, 0x02, 0x03, 0x81, 0x82 and 0x83 are allowed) - - -function decode(buffer) { - var hashType = buffer.readUInt8(buffer.length - 1); - var hashTypeMod = hashType & ~0x80; - if (hashTypeMod <= 0 || hashTypeMod >= 4) throw new Error('Invalid hashType ' + hashType); - var decoded = bip66.decode(buffer.slice(0, -1)); - var r = fromDER(decoded.r); - var s = fromDER(decoded.s); - var signature = Buffer.concat([r, s], 64); - return { - signature: signature, - hashType: hashType - }; -} - -exports.decode = decode; - -function encode(signature, hashType) { - typeforce({ - signature: types.BufferN(64), - hashType: types.UInt8 - }, { - signature: signature, - hashType: hashType - }); - var hashTypeMod = hashType & ~0x80; - if (hashTypeMod <= 0 || hashTypeMod >= 4) throw new Error('Invalid hashType ' + hashType); - var hashTypeBuffer = Buffer.allocUnsafe(1); - hashTypeBuffer.writeUInt8(hashType, 0); - var r = toDER(signature.slice(0, 32)); - var s = toDER(signature.slice(32, 64)); - return Buffer.concat([bip66.encode(r, s), hashTypeBuffer]); -} - -exports.encode = encode; -},{"./types":"TQ2w","bip66":"qbEO","typeforce":"PKU7","buffer":"dskh"}],"T5UE":[function(require,module,exports) { -module.exports = { - "OP_FALSE": 0, - "OP_0": 0, - "OP_PUSHDATA1": 76, - "OP_PUSHDATA2": 77, - "OP_PUSHDATA4": 78, - "OP_1NEGATE": 79, - "OP_RESERVED": 80, - "OP_TRUE": 81, - "OP_1": 81, - "OP_2": 82, - "OP_3": 83, - "OP_4": 84, - "OP_5": 85, - "OP_6": 86, - "OP_7": 87, - "OP_8": 88, - "OP_9": 89, - "OP_10": 90, - "OP_11": 91, - "OP_12": 92, - "OP_13": 93, - "OP_14": 94, - "OP_15": 95, - "OP_16": 96, - - "OP_NOP": 97, - "OP_VER": 98, - "OP_IF": 99, - "OP_NOTIF": 100, - "OP_VERIF": 101, - "OP_VERNOTIF": 102, - "OP_ELSE": 103, - "OP_ENDIF": 104, - "OP_VERIFY": 105, - "OP_RETURN": 106, - - "OP_TOALTSTACK": 107, - "OP_FROMALTSTACK": 108, - "OP_2DROP": 109, - "OP_2DUP": 110, - "OP_3DUP": 111, - "OP_2OVER": 112, - "OP_2ROT": 113, - "OP_2SWAP": 114, - "OP_IFDUP": 115, - "OP_DEPTH": 116, - "OP_DROP": 117, - "OP_DUP": 118, - "OP_NIP": 119, - "OP_OVER": 120, - "OP_PICK": 121, - "OP_ROLL": 122, - "OP_ROT": 123, - "OP_SWAP": 124, - "OP_TUCK": 125, - - "OP_CAT": 126, - "OP_SUBSTR": 127, - "OP_LEFT": 128, - "OP_RIGHT": 129, - "OP_SIZE": 130, - - "OP_INVERT": 131, - "OP_AND": 132, - "OP_OR": 133, - "OP_XOR": 134, - "OP_EQUAL": 135, - "OP_EQUALVERIFY": 136, - "OP_RESERVED1": 137, - "OP_RESERVED2": 138, - - "OP_1ADD": 139, - "OP_1SUB": 140, - "OP_2MUL": 141, - "OP_2DIV": 142, - "OP_NEGATE": 143, - "OP_ABS": 144, - "OP_NOT": 145, - "OP_0NOTEQUAL": 146, - "OP_ADD": 147, - "OP_SUB": 148, - "OP_MUL": 149, - "OP_DIV": 150, - "OP_MOD": 151, - "OP_LSHIFT": 152, - "OP_RSHIFT": 153, - - "OP_BOOLAND": 154, - "OP_BOOLOR": 155, - "OP_NUMEQUAL": 156, - "OP_NUMEQUALVERIFY": 157, - "OP_NUMNOTEQUAL": 158, - "OP_LESSTHAN": 159, - "OP_GREATERTHAN": 160, - "OP_LESSTHANOREQUAL": 161, - "OP_GREATERTHANOREQUAL": 162, - "OP_MIN": 163, - "OP_MAX": 164, - - "OP_WITHIN": 165, - - "OP_RIPEMD160": 166, - "OP_SHA1": 167, - "OP_SHA256": 168, - "OP_HASH160": 169, - "OP_HASH256": 170, - "OP_CODESEPARATOR": 171, - "OP_CHECKSIG": 172, - "OP_CHECKSIGVERIFY": 173, - "OP_CHECKMULTISIG": 174, - "OP_CHECKMULTISIGVERIFY": 175, - - "OP_NOP1": 176, - - "OP_NOP2": 177, - "OP_CHECKLOCKTIMEVERIFY": 177, - - "OP_NOP3": 178, - "OP_CHECKSEQUENCEVERIFY": 178, - - "OP_NOP4": 179, - "OP_NOP5": 180, - "OP_NOP6": 181, - "OP_NOP7": 182, - "OP_NOP8": 183, - "OP_NOP9": 184, - "OP_NOP10": 185, - - "OP_PUBKEYHASH": 253, - "OP_PUBKEY": 254, - "OP_INVALIDOPCODE": 255 -} -; -},{}],"HZCS":[function(require,module,exports) { -var OPS = require('bitcoin-ops') - -function encodingLength (i) { - return i < OPS.OP_PUSHDATA1 ? 1 - : i <= 0xff ? 2 - : i <= 0xffff ? 3 - : 5 -} - -function encode (buffer, number, offset) { - var size = encodingLength(number) - - // ~6 bit - if (size === 1) { - buffer.writeUInt8(number, offset) - - // 8 bit - } else if (size === 2) { - buffer.writeUInt8(OPS.OP_PUSHDATA1, offset) - buffer.writeUInt8(number, offset + 1) - - // 16 bit - } else if (size === 3) { - buffer.writeUInt8(OPS.OP_PUSHDATA2, offset) - buffer.writeUInt16LE(number, offset + 1) - - // 32 bit - } else { - buffer.writeUInt8(OPS.OP_PUSHDATA4, offset) - buffer.writeUInt32LE(number, offset + 1) - } - - return size -} - -function decode (buffer, offset) { - var opcode = buffer.readUInt8(offset) - var number, size - - // ~6 bit - if (opcode < OPS.OP_PUSHDATA1) { - number = opcode - size = 1 - - // 8 bit - } else if (opcode === OPS.OP_PUSHDATA1) { - if (offset + 2 > buffer.length) return null - number = buffer.readUInt8(offset + 1) - size = 2 - - // 16 bit - } else if (opcode === OPS.OP_PUSHDATA2) { - if (offset + 3 > buffer.length) return null - number = buffer.readUInt16LE(offset + 1) - size = 3 - - // 32 bit - } else { - if (offset + 5 > buffer.length) return null - if (opcode !== OPS.OP_PUSHDATA4) throw new Error('Unexpected opcode') - - number = buffer.readUInt32LE(offset + 1) - size = 5 - } - - return { - opcode: opcode, - number: number, - size: size - } -} - -module.exports = { - encodingLength: encodingLength, - encode: encode, - decode: decode -} - -},{"bitcoin-ops":"T5UE"}],"XAxl":[function(require,module,exports) { -var OPS = require('./index.json') - -var map = {} -for (var op in OPS) { - var code = OPS[op] - map[code] = op -} - -module.exports = map - -},{"./index.json":"T5UE"}],"Fa8t":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var scriptNumber = require('./script_number'); - -var scriptSignature = require('./script_signature'); - -var types = require('./types'); - -var bip66 = require('bip66'); - -var ecc = require('tiny-secp256k1'); - -var pushdata = require('pushdata-bitcoin'); - -var typeforce = require('typeforce'); - -exports.OPS = require('bitcoin-ops'); - -var REVERSE_OPS = require('bitcoin-ops/map'); - -var OP_INT_BASE = exports.OPS.OP_RESERVED; // OP_1 - 1 - -function isOPInt(value) { - return types.Number(value) && (value === exports.OPS.OP_0 || value >= exports.OPS.OP_1 && value <= exports.OPS.OP_16 || value === exports.OPS.OP_1NEGATE); -} - -function isPushOnlyChunk(value) { - return types.Buffer(value) || isOPInt(value); -} - -function isPushOnly(value) { - return types.Array(value) && value.every(isPushOnlyChunk); -} - -exports.isPushOnly = isPushOnly; - -function asMinimalOP(buffer) { - if (buffer.length === 0) return exports.OPS.OP_0; - if (buffer.length !== 1) return; - if (buffer[0] >= 1 && buffer[0] <= 16) return OP_INT_BASE + buffer[0]; - if (buffer[0] === 0x81) return exports.OPS.OP_1NEGATE; -} - -function chunksIsBuffer(buf) { - return Buffer.isBuffer(buf); -} - -function chunksIsArray(buf) { - return types.Array(buf); -} - -function singleChunkIsBuffer(buf) { - return Buffer.isBuffer(buf); -} - -function compile(chunks) { - // TODO: remove me - if (chunksIsBuffer(chunks)) return chunks; - typeforce(types.Array, chunks); - var bufferSize = chunks.reduce(function (accum, chunk) { - // data chunk - if (singleChunkIsBuffer(chunk)) { - // adhere to BIP62.3, minimal push policy - if (chunk.length === 1 && asMinimalOP(chunk) !== undefined) { - return accum + 1; - } - - return accum + pushdata.encodingLength(chunk.length) + chunk.length; - } // opcode - - - return accum + 1; - }, 0.0); - var buffer = Buffer.allocUnsafe(bufferSize); - var offset = 0; - chunks.forEach(function (chunk) { - // data chunk - if (singleChunkIsBuffer(chunk)) { - // adhere to BIP62.3, minimal push policy - var opcode = asMinimalOP(chunk); - - if (opcode !== undefined) { - buffer.writeUInt8(opcode, offset); - offset += 1; - return; - } - - offset += pushdata.encode(buffer, chunk.length, offset); - chunk.copy(buffer, offset); - offset += chunk.length; // opcode - } else { - buffer.writeUInt8(chunk, offset); - offset += 1; - } - }); - if (offset !== buffer.length) throw new Error('Could not decode chunks'); - return buffer; -} - -exports.compile = compile; - -function decompile(buffer) { - // TODO: remove me - if (chunksIsArray(buffer)) return buffer; - typeforce(types.Buffer, buffer); - var chunks = []; - var i = 0; - - while (i < buffer.length) { - var opcode = buffer[i]; // data chunk - - if (opcode > exports.OPS.OP_0 && opcode <= exports.OPS.OP_PUSHDATA4) { - var d = pushdata.decode(buffer, i); // did reading a pushDataInt fail? - - if (d === null) return null; - i += d.size; // attempt to read too much data? - - if (i + d.number > buffer.length) return null; - var data = buffer.slice(i, i + d.number); - i += d.number; // decompile minimally - - var op = asMinimalOP(data); - - if (op !== undefined) { - chunks.push(op); - } else { - chunks.push(data); - } // opcode - - } else { - chunks.push(opcode); - i += 1; - } - } - - return chunks; -} - -exports.decompile = decompile; - -function toASM(chunks) { - if (chunksIsBuffer(chunks)) { - chunks = decompile(chunks); - } - - return chunks.map(function (chunk) { - // data? - if (singleChunkIsBuffer(chunk)) { - var op = asMinimalOP(chunk); - if (op === undefined) return chunk.toString('hex'); - chunk = op; - } // opcode! - - - return REVERSE_OPS[chunk]; - }).join(' '); -} - -exports.toASM = toASM; - -function fromASM(asm) { - typeforce(types.String, asm); - return compile(asm.split(' ').map(function (chunkStr) { - // opcode? - if (exports.OPS[chunkStr] !== undefined) return exports.OPS[chunkStr]; - typeforce(types.Hex, chunkStr); // data! - - return Buffer.from(chunkStr, 'hex'); - })); -} - -exports.fromASM = fromASM; - -function toStack(chunks) { - chunks = decompile(chunks); - typeforce(isPushOnly, chunks); - return chunks.map(function (op) { - if (singleChunkIsBuffer(op)) return op; - if (op === exports.OPS.OP_0) return Buffer.allocUnsafe(0); - return scriptNumber.encode(op - OP_INT_BASE); - }); -} - -exports.toStack = toStack; - -function isCanonicalPubKey(buffer) { - return ecc.isPoint(buffer); -} - -exports.isCanonicalPubKey = isCanonicalPubKey; - -function isDefinedHashType(hashType) { - var hashTypeMod = hashType & ~0x80; // return hashTypeMod > SIGHASH_ALL && hashTypeMod < SIGHASH_SINGLE - - return hashTypeMod > 0x00 && hashTypeMod < 0x04; -} - -exports.isDefinedHashType = isDefinedHashType; - -function isCanonicalScriptSignature(buffer) { - if (!Buffer.isBuffer(buffer)) return false; - if (!isDefinedHashType(buffer[buffer.length - 1])) return false; - return bip66.check(buffer.slice(0, -1)); -} - -exports.isCanonicalScriptSignature = isCanonicalScriptSignature; // tslint:disable-next-line variable-name - -exports.number = scriptNumber; -exports.signature = scriptSignature; -},{"./script_number":"P3Rn","./script_signature":"d9co","./types":"TQ2w","bip66":"qbEO","tiny-secp256k1":"fCMY","pushdata-bitcoin":"HZCS","typeforce":"PKU7","bitcoin-ops":"T5UE","bitcoin-ops/map":"XAxl","buffer":"dskh"}],"JBHK":[function(require,module,exports) { -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -function prop(object, name, f) { - Object.defineProperty(object, name, { - configurable: true, - enumerable: true, - get: function get() { - var _value = f.call(this); - - this[name] = _value; - return _value; - }, - set: function set(_value) { - Object.defineProperty(this, name, { - configurable: true, - enumerable: true, - value: _value, - writable: true - }); - } - }); -} - -exports.prop = prop; - -function value(f) { - var _value; - - return function () { - if (_value !== undefined) return _value; - _value = f(); - return _value; - }; -} - -exports.value = value; -},{}],"q7Hj":[function(require,module,exports) { -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var networks_1 = require('../networks'); - -var bscript = require('../script'); - -var lazy = require('./lazy'); - -var typef = require('typeforce'); - -var OPS = bscript.OPS; - -function stacksEqual(a, b) { - if (a.length !== b.length) return false; - return a.every(function (x, i) { - return x.equals(b[i]); - }); -} // output: OP_RETURN ... - - -function p2data(a, opts) { - if (!a.data && !a.output) throw new TypeError('Not enough data'); - opts = Object.assign({ - validate: true - }, opts || {}); - typef({ - network: typef.maybe(typef.Object), - output: typef.maybe(typef.Buffer), - data: typef.maybe(typef.arrayOf(typef.Buffer)) - }, a); - var network = a.network || networks_1.bitcoin; - var o = { - name: 'embed', - network: network - }; - lazy.prop(o, 'output', function () { - if (!a.data) return; - return bscript.compile([OPS.OP_RETURN].concat(a.data)); - }); - lazy.prop(o, 'data', function () { - if (!a.output) return; - return bscript.decompile(a.output).slice(1); - }); // extended validation - - if (opts.validate) { - if (a.output) { - var chunks = bscript.decompile(a.output); - if (chunks[0] !== OPS.OP_RETURN) throw new TypeError('Output is invalid'); - if (!chunks.slice(1).every(typef.Buffer)) throw new TypeError('Output is invalid'); - if (a.data && !stacksEqual(a.data, o.data)) throw new TypeError('Data mismatch'); - } - } - - return Object.assign(o, a); -} - -exports.p2data = p2data; -},{"../networks":"rvS6","../script":"Fa8t","./lazy":"JBHK","typeforce":"PKU7"}],"SY7q":[function(require,module,exports) { -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var networks_1 = require('../networks'); - -var bscript = require('../script'); - -var lazy = require('./lazy'); - -var OPS = bscript.OPS; - -var typef = require('typeforce'); - -var ecc = require('tiny-secp256k1'); - -var OP_INT_BASE = OPS.OP_RESERVED; // OP_1 - 1 - -function stacksEqual(a, b) { - if (a.length !== b.length) return false; - return a.every(function (x, i) { - return x.equals(b[i]); - }); -} // input: OP_0 [signatures ...] -// output: m [pubKeys ...] n OP_CHECKMULTISIG - - -function p2ms(a, opts) { - if (!a.input && !a.output && !(a.pubkeys && a.m !== undefined) && !a.signatures) throw new TypeError('Not enough data'); - opts = Object.assign({ - validate: true - }, opts || {}); - - function isAcceptableSignature(x) { - return bscript.isCanonicalScriptSignature(x) || (opts.allowIncomplete && x === OPS.OP_0) !== undefined; - } - - typef({ - network: typef.maybe(typef.Object), - m: typef.maybe(typef.Number), - n: typef.maybe(typef.Number), - output: typef.maybe(typef.Buffer), - pubkeys: typef.maybe(typef.arrayOf(ecc.isPoint)), - signatures: typef.maybe(typef.arrayOf(isAcceptableSignature)), - input: typef.maybe(typef.Buffer) - }, a); - var network = a.network || networks_1.bitcoin; - var o = { - network: network - }; - var chunks = []; - var decoded = false; - - function decode(output) { - if (decoded) return; - decoded = true; - chunks = bscript.decompile(output); - o.m = chunks[0] - OP_INT_BASE; - o.n = chunks[chunks.length - 2] - OP_INT_BASE; - o.pubkeys = chunks.slice(1, -2); - } - - lazy.prop(o, 'output', function () { - if (!a.m) return; - if (!o.n) return; - if (!a.pubkeys) return; - return bscript.compile([].concat(OP_INT_BASE + a.m, a.pubkeys, OP_INT_BASE + o.n, OPS.OP_CHECKMULTISIG)); - }); - lazy.prop(o, 'm', function () { - if (!o.output) return; - decode(o.output); - return o.m; - }); - lazy.prop(o, 'n', function () { - if (!o.pubkeys) return; - return o.pubkeys.length; - }); - lazy.prop(o, 'pubkeys', function () { - if (!a.output) return; - decode(a.output); - return o.pubkeys; - }); - lazy.prop(o, 'signatures', function () { - if (!a.input) return; - return bscript.decompile(a.input).slice(1); - }); - lazy.prop(o, 'input', function () { - if (!a.signatures) return; - return bscript.compile([OPS.OP_0].concat(a.signatures)); - }); - lazy.prop(o, 'witness', function () { - if (!o.input) return; - return []; - }); - lazy.prop(o, 'name', function () { - if (!o.m || !o.n) return; - return "p2ms(".concat(o.m, " of ").concat(o.n, ")"); - }); // extended validation - - if (opts.validate) { - if (a.output) { - decode(a.output); - if (!typef.Number(chunks[0])) throw new TypeError('Output is invalid'); - if (!typef.Number(chunks[chunks.length - 2])) throw new TypeError('Output is invalid'); - if (chunks[chunks.length - 1] !== OPS.OP_CHECKMULTISIG) throw new TypeError('Output is invalid'); - if (o.m <= 0 || o.n > 16 || o.m > o.n || o.n !== chunks.length - 3) throw new TypeError('Output is invalid'); - if (!o.pubkeys.every(function (x) { - return ecc.isPoint(x); - })) throw new TypeError('Output is invalid'); - if (a.m !== undefined && a.m !== o.m) throw new TypeError('m mismatch'); - if (a.n !== undefined && a.n !== o.n) throw new TypeError('n mismatch'); - if (a.pubkeys && !stacksEqual(a.pubkeys, o.pubkeys)) throw new TypeError('Pubkeys mismatch'); - } - - if (a.pubkeys) { - if (a.n !== undefined && a.n !== a.pubkeys.length) throw new TypeError('Pubkey count mismatch'); - o.n = a.pubkeys.length; - if (o.n < o.m) throw new TypeError('Pubkey count cannot be less than m'); - } - - if (a.signatures) { - if (a.signatures.length < o.m) throw new TypeError('Not enough signatures provided'); - if (a.signatures.length > o.m) throw new TypeError('Too many signatures provided'); - } - - if (a.input) { - if (a.input[0] !== OPS.OP_0) throw new TypeError('Input is invalid'); - if (o.signatures.length === 0 || !o.signatures.every(isAcceptableSignature)) throw new TypeError('Input has invalid signature(s)'); - if (a.signatures && !stacksEqual(a.signatures, o.signatures)) throw new TypeError('Signature mismatch'); - if (a.m !== undefined && a.m !== a.signatures.length) throw new TypeError('Signature count mismatch'); - } - } - - return Object.assign(o, a); -} - -exports.p2ms = p2ms; -},{"../networks":"rvS6","../script":"Fa8t","./lazy":"JBHK","typeforce":"PKU7","tiny-secp256k1":"fCMY"}],"jLkq":[function(require,module,exports) { -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var networks_1 = require('../networks'); - -var bscript = require('../script'); - -var lazy = require('./lazy'); - -var typef = require('typeforce'); - -var OPS = bscript.OPS; - -var ecc = require('tiny-secp256k1'); // input: {signature} -// output: {pubKey} OP_CHECKSIG - - -function p2pk(a, opts) { - if (!a.input && !a.output && !a.pubkey && !a.input && !a.signature) throw new TypeError('Not enough data'); - opts = Object.assign({ - validate: true - }, opts || {}); - typef({ - network: typef.maybe(typef.Object), - output: typef.maybe(typef.Buffer), - pubkey: typef.maybe(ecc.isPoint), - signature: typef.maybe(bscript.isCanonicalScriptSignature), - input: typef.maybe(typef.Buffer) - }, a); - - var _chunks = lazy.value(function () { - return bscript.decompile(a.input); - }); - - var network = a.network || networks_1.bitcoin; - var o = { - name: 'p2pk', - network: network - }; - lazy.prop(o, 'output', function () { - if (!a.pubkey) return; - return bscript.compile([a.pubkey, OPS.OP_CHECKSIG]); - }); - lazy.prop(o, 'pubkey', function () { - if (!a.output) return; - return a.output.slice(1, -1); - }); - lazy.prop(o, 'signature', function () { - if (!a.input) return; - return _chunks()[0]; - }); - lazy.prop(o, 'input', function () { - if (!a.signature) return; - return bscript.compile([a.signature]); - }); - lazy.prop(o, 'witness', function () { - if (!o.input) return; - return []; - }); // extended validation - - if (opts.validate) { - if (a.output) { - if (a.output[a.output.length - 1] !== OPS.OP_CHECKSIG) throw new TypeError('Output is invalid'); - if (!ecc.isPoint(o.pubkey)) throw new TypeError('Output pubkey is invalid'); - if (a.pubkey && !a.pubkey.equals(o.pubkey)) throw new TypeError('Pubkey mismatch'); - } - - if (a.signature) { - if (a.input && !a.input.equals(o.input)) throw new TypeError('Signature mismatch'); - } - - if (a.input) { - if (_chunks().length !== 1) throw new TypeError('Input is invalid'); - if (!bscript.isCanonicalScriptSignature(o.signature)) throw new TypeError('Input has invalid signature'); - } - } - - return Object.assign(o, a); -} - -exports.p2pk = p2pk; -},{"../networks":"rvS6","../script":"Fa8t","./lazy":"JBHK","typeforce":"PKU7","tiny-secp256k1":"fCMY"}],"uv3I":[function(require,module,exports) { -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var createHash = require('create-hash'); - -function ripemd160(buffer) { - try { - return createHash('rmd160').update(buffer).digest(); - } catch (err) { - return createHash('ripemd160').update(buffer).digest(); - } -} - -exports.ripemd160 = ripemd160; - -function sha1(buffer) { - return createHash('sha1').update(buffer).digest(); -} - -exports.sha1 = sha1; - -function sha256(buffer) { - return createHash('sha256').update(buffer).digest(); -} - -exports.sha256 = sha256; - -function hash160(buffer) { - return ripemd160(sha256(buffer)); -} - -exports.hash160 = hash160; - -function hash256(buffer) { - return sha256(sha256(buffer)); -} - -exports.hash256 = hash256; -},{"create-hash":"LF8r"}],"lzf5":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var bcrypto = require('../crypto'); - -var networks_1 = require('../networks'); - -var bscript = require('../script'); - -var lazy = require('./lazy'); - -var typef = require('typeforce'); - -var OPS = bscript.OPS; - -var ecc = require('tiny-secp256k1'); - -var bs58check = require('bs58check'); // input: {signature} {pubkey} -// output: OP_DUP OP_HASH160 {hash160(pubkey)} OP_EQUALVERIFY OP_CHECKSIG - - -function p2pkh(a, opts) { - if (!a.address && !a.hash && !a.output && !a.pubkey && !a.input) throw new TypeError('Not enough data'); - opts = Object.assign({ - validate: true - }, opts || {}); - typef({ - network: typef.maybe(typef.Object), - address: typef.maybe(typef.String), - hash: typef.maybe(typef.BufferN(20)), - output: typef.maybe(typef.BufferN(25)), - pubkey: typef.maybe(ecc.isPoint), - signature: typef.maybe(bscript.isCanonicalScriptSignature), - input: typef.maybe(typef.Buffer) - }, a); - - var _address = lazy.value(function () { - var payload = bs58check.decode(a.address); - var version = payload.readUInt8(0); - var hash = payload.slice(1); - return { - version: version, - hash: hash - }; - }); - - var _chunks = lazy.value(function () { - return bscript.decompile(a.input); - }); - - var network = a.network || networks_1.bitcoin; - var o = { - name: 'p2pkh', - network: network - }; - lazy.prop(o, 'address', function () { - if (!o.hash) return; - var payload = Buffer.allocUnsafe(21); - payload.writeUInt8(network.pubKeyHash, 0); - o.hash.copy(payload, 1); - return bs58check.encode(payload); - }); - lazy.prop(o, 'hash', function () { - if (a.output) return a.output.slice(3, 23); - if (a.address) return _address().hash; - if (a.pubkey || o.pubkey) return bcrypto.hash160(a.pubkey || o.pubkey); - }); - lazy.prop(o, 'output', function () { - if (!o.hash) return; - return bscript.compile([OPS.OP_DUP, OPS.OP_HASH160, o.hash, OPS.OP_EQUALVERIFY, OPS.OP_CHECKSIG]); - }); - lazy.prop(o, 'pubkey', function () { - if (!a.input) return; - return _chunks()[1]; - }); - lazy.prop(o, 'signature', function () { - if (!a.input) return; - return _chunks()[0]; - }); - lazy.prop(o, 'input', function () { - if (!a.pubkey) return; - if (!a.signature) return; - return bscript.compile([a.signature, a.pubkey]); - }); - lazy.prop(o, 'witness', function () { - if (!o.input) return; - return []; - }); // extended validation - - if (opts.validate) { - var hash = Buffer.from([]); - - if (a.address) { - if (_address().version !== network.pubKeyHash) throw new TypeError('Invalid version or Network mismatch'); - if (_address().hash.length !== 20) throw new TypeError('Invalid address'); - hash = _address().hash; - } - - if (a.hash) { - if (hash.length > 0 && !hash.equals(a.hash)) throw new TypeError('Hash mismatch');else hash = a.hash; - } - - if (a.output) { - if (a.output.length !== 25 || a.output[0] !== OPS.OP_DUP || a.output[1] !== OPS.OP_HASH160 || a.output[2] !== 0x14 || a.output[23] !== OPS.OP_EQUALVERIFY || a.output[24] !== OPS.OP_CHECKSIG) throw new TypeError('Output is invalid'); - var hash2 = a.output.slice(3, 23); - if (hash.length > 0 && !hash.equals(hash2)) throw new TypeError('Hash mismatch');else hash = hash2; - } - - if (a.pubkey) { - var pkh = bcrypto.hash160(a.pubkey); - if (hash.length > 0 && !hash.equals(pkh)) throw new TypeError('Hash mismatch');else hash = pkh; - } - - if (a.input) { - var chunks = _chunks(); - - if (chunks.length !== 2) throw new TypeError('Input is invalid'); - if (!bscript.isCanonicalScriptSignature(chunks[0])) throw new TypeError('Input has invalid signature'); - if (!ecc.isPoint(chunks[1])) throw new TypeError('Input has invalid pubkey'); - if (a.signature && !a.signature.equals(chunks[0])) throw new TypeError('Signature mismatch'); - if (a.pubkey && !a.pubkey.equals(chunks[1])) throw new TypeError('Pubkey mismatch'); - - var _pkh = bcrypto.hash160(chunks[1]); - - if (hash.length > 0 && !hash.equals(_pkh)) throw new TypeError('Hash mismatch'); - } - } - - return Object.assign(o, a); -} - -exports.p2pkh = p2pkh; -},{"../crypto":"uv3I","../networks":"rvS6","../script":"Fa8t","./lazy":"JBHK","typeforce":"PKU7","tiny-secp256k1":"fCMY","bs58check":"lJVR","buffer":"dskh"}],"pamC":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var bcrypto = require('../crypto'); - -var networks_1 = require('../networks'); - -var bscript = require('../script'); - -var lazy = require('./lazy'); - -var typef = require('typeforce'); - -var OPS = bscript.OPS; - -var bs58check = require('bs58check'); - -function stacksEqual(a, b) { - if (a.length !== b.length) return false; - return a.every(function (x, i) { - return x.equals(b[i]); - }); -} // input: [redeemScriptSig ...] {redeemScript} -// witness: -// output: OP_HASH160 {hash160(redeemScript)} OP_EQUAL - - -function p2sh(a, opts) { - if (!a.address && !a.hash && !a.output && !a.redeem && !a.input) throw new TypeError('Not enough data'); - opts = Object.assign({ - validate: true - }, opts || {}); - typef({ - network: typef.maybe(typef.Object), - address: typef.maybe(typef.String), - hash: typef.maybe(typef.BufferN(20)), - output: typef.maybe(typef.BufferN(23)), - redeem: typef.maybe({ - network: typef.maybe(typef.Object), - output: typef.maybe(typef.Buffer), - input: typef.maybe(typef.Buffer), - witness: typef.maybe(typef.arrayOf(typef.Buffer)) - }), - input: typef.maybe(typef.Buffer), - witness: typef.maybe(typef.arrayOf(typef.Buffer)) - }, a); - var network = a.network; - - if (!network) { - network = a.redeem && a.redeem.network || networks_1.bitcoin; - } - - var o = { - network: network - }; - - var _address = lazy.value(function () { - var payload = bs58check.decode(a.address); - var version = payload.readUInt8(0); - var hash = payload.slice(1); - return { - version: version, - hash: hash - }; - }); - - var _chunks = lazy.value(function () { - return bscript.decompile(a.input); - }); - - var _redeem = lazy.value(function () { - var chunks = _chunks(); - - return { - network: network, - output: chunks[chunks.length - 1], - input: bscript.compile(chunks.slice(0, -1)), - witness: a.witness || [] - }; - }); // output dependents - - - lazy.prop(o, 'address', function () { - if (!o.hash) return; - var payload = Buffer.allocUnsafe(21); - payload.writeUInt8(o.network.scriptHash, 0); - o.hash.copy(payload, 1); - return bs58check.encode(payload); - }); - lazy.prop(o, 'hash', function () { - // in order of least effort - if (a.output) return a.output.slice(2, 22); - if (a.address) return _address().hash; - if (o.redeem && o.redeem.output) return bcrypto.hash160(o.redeem.output); - }); - lazy.prop(o, 'output', function () { - if (!o.hash) return; - return bscript.compile([OPS.OP_HASH160, o.hash, OPS.OP_EQUAL]); - }); // input dependents - - lazy.prop(o, 'redeem', function () { - if (!a.input) return; - return _redeem(); - }); - lazy.prop(o, 'input', function () { - if (!a.redeem || !a.redeem.input || !a.redeem.output) return; - return bscript.compile([].concat(bscript.decompile(a.redeem.input), a.redeem.output)); - }); - lazy.prop(o, 'witness', function () { - if (o.redeem && o.redeem.witness) return o.redeem.witness; - if (o.input) return []; - }); - lazy.prop(o, 'name', function () { - var nameParts = ['p2sh']; - if (o.redeem !== undefined) nameParts.push(o.redeem.name); - return nameParts.join('-'); - }); - - if (opts.validate) { - var hash = Buffer.from([]); - - if (a.address) { - if (_address().version !== network.scriptHash) throw new TypeError('Invalid version or Network mismatch'); - if (_address().hash.length !== 20) throw new TypeError('Invalid address'); - hash = _address().hash; - } - - if (a.hash) { - if (hash.length > 0 && !hash.equals(a.hash)) throw new TypeError('Hash mismatch');else hash = a.hash; - } - - if (a.output) { - if (a.output.length !== 23 || a.output[0] !== OPS.OP_HASH160 || a.output[1] !== 0x14 || a.output[22] !== OPS.OP_EQUAL) throw new TypeError('Output is invalid'); - var hash2 = a.output.slice(2, 22); - if (hash.length > 0 && !hash.equals(hash2)) throw new TypeError('Hash mismatch');else hash = hash2; - } // inlined to prevent 'no-inner-declarations' failing - - - var checkRedeem = function checkRedeem(redeem) { - // is the redeem output empty/invalid? - if (redeem.output) { - var decompile = bscript.decompile(redeem.output); - if (!decompile || decompile.length < 1) throw new TypeError('Redeem.output too short'); // match hash against other sources - - var _hash = bcrypto.hash160(redeem.output); - - if (hash.length > 0 && !hash.equals(_hash)) throw new TypeError('Hash mismatch');else hash = _hash; - } - - if (redeem.input) { - var hasInput = redeem.input.length > 0; - var hasWitness = redeem.witness && redeem.witness.length > 0; - if (!hasInput && !hasWitness) throw new TypeError('Empty input'); - if (hasInput && hasWitness) throw new TypeError('Input and witness provided'); - - if (hasInput) { - var richunks = bscript.decompile(redeem.input); - if (!bscript.isPushOnly(richunks)) throw new TypeError('Non push-only scriptSig'); - } - } - }; - - if (a.input) { - var chunks = _chunks(); - - if (!chunks || chunks.length < 1) throw new TypeError('Input too short'); - if (!Buffer.isBuffer(_redeem().output)) throw new TypeError('Input is invalid'); - checkRedeem(_redeem()); - } - - if (a.redeem) { - if (a.redeem.network && a.redeem.network !== network) throw new TypeError('Network mismatch'); - - if (a.input) { - var redeem = _redeem(); - - if (a.redeem.output && !a.redeem.output.equals(redeem.output)) throw new TypeError('Redeem.output mismatch'); - if (a.redeem.input && !a.redeem.input.equals(redeem.input)) throw new TypeError('Redeem.input mismatch'); - } - - checkRedeem(a.redeem); - } - - if (a.witness) { - if (a.redeem && a.redeem.witness && !stacksEqual(a.redeem.witness, a.witness)) throw new TypeError('Witness and redeem.witness mismatch'); - } - } - - return Object.assign(o, a); -} - -exports.p2sh = p2sh; -},{"../crypto":"uv3I","../networks":"rvS6","../script":"Fa8t","./lazy":"JBHK","typeforce":"PKU7","bs58check":"lJVR","buffer":"dskh"}],"gbth":[function(require,module,exports) { -'use strict' -var ALPHABET = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l' - -// pre-compute lookup table -var ALPHABET_MAP = {} -for (var z = 0; z < ALPHABET.length; z++) { - var x = ALPHABET.charAt(z) - - if (ALPHABET_MAP[x] !== undefined) throw new TypeError(x + ' is ambiguous') - ALPHABET_MAP[x] = z -} - -function polymodStep (pre) { - var b = pre >> 25 - return ((pre & 0x1FFFFFF) << 5) ^ - (-((b >> 0) & 1) & 0x3b6a57b2) ^ - (-((b >> 1) & 1) & 0x26508e6d) ^ - (-((b >> 2) & 1) & 0x1ea119fa) ^ - (-((b >> 3) & 1) & 0x3d4233dd) ^ - (-((b >> 4) & 1) & 0x2a1462b3) -} - -function prefixChk (prefix) { - var chk = 1 - for (var i = 0; i < prefix.length; ++i) { - var c = prefix.charCodeAt(i) - if (c < 33 || c > 126) throw new Error('Invalid prefix (' + prefix + ')') - - chk = polymodStep(chk) ^ (c >> 5) - } - chk = polymodStep(chk) - - for (i = 0; i < prefix.length; ++i) { - var v = prefix.charCodeAt(i) - chk = polymodStep(chk) ^ (v & 0x1f) - } - return chk -} - -function encode (prefix, words, LIMIT) { - LIMIT = LIMIT || 90 - if ((prefix.length + 7 + words.length) > LIMIT) throw new TypeError('Exceeds length limit') - - prefix = prefix.toLowerCase() - - // determine chk mod - var chk = prefixChk(prefix) - var result = prefix + '1' - for (var i = 0; i < words.length; ++i) { - var x = words[i] - if ((x >> 5) !== 0) throw new Error('Non 5-bit word') - - chk = polymodStep(chk) ^ x - result += ALPHABET.charAt(x) - } - - for (i = 0; i < 6; ++i) { - chk = polymodStep(chk) - } - chk ^= 1 - - for (i = 0; i < 6; ++i) { - var v = (chk >> ((5 - i) * 5)) & 0x1f - result += ALPHABET.charAt(v) - } - - return result -} - -function decode (str, LIMIT) { - LIMIT = LIMIT || 90 - if (str.length < 8) throw new TypeError(str + ' too short') - if (str.length > LIMIT) throw new TypeError('Exceeds length limit') - - // don't allow mixed case - var lowered = str.toLowerCase() - var uppered = str.toUpperCase() - if (str !== lowered && str !== uppered) throw new Error('Mixed-case string ' + str) - str = lowered - - var split = str.lastIndexOf('1') - if (split === -1) throw new Error('No separator character for ' + str) - if (split === 0) throw new Error('Missing prefix for ' + str) - - var prefix = str.slice(0, split) - var wordChars = str.slice(split + 1) - if (wordChars.length < 6) throw new Error('Data too short') - - var chk = prefixChk(prefix) - var words = [] - for (var i = 0; i < wordChars.length; ++i) { - var c = wordChars.charAt(i) - var v = ALPHABET_MAP[c] - if (v === undefined) throw new Error('Unknown character ' + c) - chk = polymodStep(chk) ^ v - - // not in the checksum? - if (i + 6 >= wordChars.length) continue - words.push(v) - } - - if (chk !== 1) throw new Error('Invalid checksum for ' + str) - return { prefix: prefix, words: words } -} - -function convert (data, inBits, outBits, pad) { - var value = 0 - var bits = 0 - var maxV = (1 << outBits) - 1 - - var result = [] - for (var i = 0; i < data.length; ++i) { - value = (value << inBits) | data[i] - bits += inBits - - while (bits >= outBits) { - bits -= outBits - result.push((value >> bits) & maxV) - } - } - - if (pad) { - if (bits > 0) { - result.push((value << (outBits - bits)) & maxV) - } - } else { - if (bits >= inBits) throw new Error('Excess padding') - if ((value << (outBits - bits)) & maxV) throw new Error('Non-zero padding') - } - - return result -} - -function toWords (bytes) { - return convert(bytes, 8, 5, true) -} - -function fromWords (words) { - return convert(words, 5, 8, false) -} - -module.exports = { - decode: decode, - encode: encode, - toWords: toWords, - fromWords: fromWords -} - -},{}],"ThHa":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var bcrypto = require('../crypto'); - -var networks_1 = require('../networks'); - -var bscript = require('../script'); - -var lazy = require('./lazy'); - -var typef = require('typeforce'); - -var OPS = bscript.OPS; - -var ecc = require('tiny-secp256k1'); - -var bech32 = require('bech32'); - -var EMPTY_BUFFER = Buffer.alloc(0); // witness: {signature} {pubKey} -// input: <> -// output: OP_0 {pubKeyHash} - -function p2wpkh(a, opts) { - if (!a.address && !a.hash && !a.output && !a.pubkey && !a.witness) throw new TypeError('Not enough data'); - opts = Object.assign({ - validate: true - }, opts || {}); - typef({ - address: typef.maybe(typef.String), - hash: typef.maybe(typef.BufferN(20)), - input: typef.maybe(typef.BufferN(0)), - network: typef.maybe(typef.Object), - output: typef.maybe(typef.BufferN(22)), - pubkey: typef.maybe(ecc.isPoint), - signature: typef.maybe(bscript.isCanonicalScriptSignature), - witness: typef.maybe(typef.arrayOf(typef.Buffer)) - }, a); - - var _address = lazy.value(function () { - var result = bech32.decode(a.address); - var version = result.words.shift(); - var data = bech32.fromWords(result.words); - return { - version: version, - prefix: result.prefix, - data: Buffer.from(data) - }; - }); - - var network = a.network || networks_1.bitcoin; - var o = { - name: 'p2wpkh', - network: network - }; - lazy.prop(o, 'address', function () { - if (!o.hash) return; - var words = bech32.toWords(o.hash); - words.unshift(0x00); - return bech32.encode(network.bech32, words); - }); - lazy.prop(o, 'hash', function () { - if (a.output) return a.output.slice(2, 22); - if (a.address) return _address().data; - if (a.pubkey || o.pubkey) return bcrypto.hash160(a.pubkey || o.pubkey); - }); - lazy.prop(o, 'output', function () { - if (!o.hash) return; - return bscript.compile([OPS.OP_0, o.hash]); - }); - lazy.prop(o, 'pubkey', function () { - if (a.pubkey) return a.pubkey; - if (!a.witness) return; - return a.witness[1]; - }); - lazy.prop(o, 'signature', function () { - if (!a.witness) return; - return a.witness[0]; - }); - lazy.prop(o, 'input', function () { - if (!o.witness) return; - return EMPTY_BUFFER; - }); - lazy.prop(o, 'witness', function () { - if (!a.pubkey) return; - if (!a.signature) return; - return [a.signature, a.pubkey]; - }); // extended validation - - if (opts.validate) { - var hash = Buffer.from([]); - - if (a.address) { - if (network && network.bech32 !== _address().prefix) throw new TypeError('Invalid prefix or Network mismatch'); - if (_address().version !== 0x00) throw new TypeError('Invalid address version'); - if (_address().data.length !== 20) throw new TypeError('Invalid address data'); - hash = _address().data; - } - - if (a.hash) { - if (hash.length > 0 && !hash.equals(a.hash)) throw new TypeError('Hash mismatch');else hash = a.hash; - } - - if (a.output) { - if (a.output.length !== 22 || a.output[0] !== OPS.OP_0 || a.output[1] !== 0x14) throw new TypeError('Output is invalid'); - if (hash.length > 0 && !hash.equals(a.output.slice(2))) throw new TypeError('Hash mismatch');else hash = a.output.slice(2); - } - - if (a.pubkey) { - var pkh = bcrypto.hash160(a.pubkey); - if (hash.length > 0 && !hash.equals(pkh)) throw new TypeError('Hash mismatch');else hash = pkh; - } - - if (a.witness) { - if (a.witness.length !== 2) throw new TypeError('Witness is invalid'); - if (!bscript.isCanonicalScriptSignature(a.witness[0])) throw new TypeError('Witness has invalid signature'); - if (!ecc.isPoint(a.witness[1])) throw new TypeError('Witness has invalid pubkey'); - if (a.signature && !a.signature.equals(a.witness[0])) throw new TypeError('Signature mismatch'); - if (a.pubkey && !a.pubkey.equals(a.witness[1])) throw new TypeError('Pubkey mismatch'); - - var _pkh = bcrypto.hash160(a.witness[1]); - - if (hash.length > 0 && !hash.equals(_pkh)) throw new TypeError('Hash mismatch'); - } - } - - return Object.assign(o, a); -} - -exports.p2wpkh = p2wpkh; -},{"../crypto":"uv3I","../networks":"rvS6","../script":"Fa8t","./lazy":"JBHK","typeforce":"PKU7","tiny-secp256k1":"fCMY","bech32":"gbth","buffer":"dskh"}],"dY19":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var bcrypto = require('../crypto'); - -var networks_1 = require('../networks'); - -var bscript = require('../script'); - -var lazy = require('./lazy'); - -var typef = require('typeforce'); - -var OPS = bscript.OPS; - -var bech32 = require('bech32'); - -var EMPTY_BUFFER = Buffer.alloc(0); - -function stacksEqual(a, b) { - if (a.length !== b.length) return false; - return a.every(function (x, i) { - return x.equals(b[i]); - }); -} // input: <> -// witness: [redeemScriptSig ...] {redeemScript} -// output: OP_0 {sha256(redeemScript)} - - -function p2wsh(a, opts) { - if (!a.address && !a.hash && !a.output && !a.redeem && !a.witness) throw new TypeError('Not enough data'); - opts = Object.assign({ - validate: true - }, opts || {}); - typef({ - network: typef.maybe(typef.Object), - address: typef.maybe(typef.String), - hash: typef.maybe(typef.BufferN(32)), - output: typef.maybe(typef.BufferN(34)), - redeem: typef.maybe({ - input: typef.maybe(typef.Buffer), - network: typef.maybe(typef.Object), - output: typef.maybe(typef.Buffer), - witness: typef.maybe(typef.arrayOf(typef.Buffer)) - }), - input: typef.maybe(typef.BufferN(0)), - witness: typef.maybe(typef.arrayOf(typef.Buffer)) - }, a); - - var _address = lazy.value(function () { - var result = bech32.decode(a.address); - var version = result.words.shift(); - var data = bech32.fromWords(result.words); - return { - version: version, - prefix: result.prefix, - data: Buffer.from(data) - }; - }); - - var _rchunks = lazy.value(function () { - return bscript.decompile(a.redeem.input); - }); - - var network = a.network; - - if (!network) { - network = a.redeem && a.redeem.network || networks_1.bitcoin; - } - - var o = { - network: network - }; - lazy.prop(o, 'address', function () { - if (!o.hash) return; - var words = bech32.toWords(o.hash); - words.unshift(0x00); - return bech32.encode(network.bech32, words); - }); - lazy.prop(o, 'hash', function () { - if (a.output) return a.output.slice(2); - if (a.address) return _address().data; - if (o.redeem && o.redeem.output) return bcrypto.sha256(o.redeem.output); - }); - lazy.prop(o, 'output', function () { - if (!o.hash) return; - return bscript.compile([OPS.OP_0, o.hash]); - }); - lazy.prop(o, 'redeem', function () { - if (!a.witness) return; - return { - output: a.witness[a.witness.length - 1], - input: EMPTY_BUFFER, - witness: a.witness.slice(0, -1) - }; - }); - lazy.prop(o, 'input', function () { - if (!o.witness) return; - return EMPTY_BUFFER; - }); - lazy.prop(o, 'witness', function () { - // transform redeem input to witness stack? - if (a.redeem && a.redeem.input && a.redeem.input.length > 0 && a.redeem.output && a.redeem.output.length > 0) { - var stack = bscript.toStack(_rchunks()); // assign, and blank the existing input - - o.redeem = Object.assign({ - witness: stack - }, a.redeem); - o.redeem.input = EMPTY_BUFFER; - return [].concat(stack, a.redeem.output); - } - - if (!a.redeem) return; - if (!a.redeem.output) return; - if (!a.redeem.witness) return; - return [].concat(a.redeem.witness, a.redeem.output); - }); - lazy.prop(o, 'name', function () { - var nameParts = ['p2wsh']; - if (o.redeem !== undefined) nameParts.push(o.redeem.name); - return nameParts.join('-'); - }); // extended validation - - if (opts.validate) { - var hash = Buffer.from([]); - - if (a.address) { - if (_address().prefix !== network.bech32) throw new TypeError('Invalid prefix or Network mismatch'); - if (_address().version !== 0x00) throw new TypeError('Invalid address version'); - if (_address().data.length !== 32) throw new TypeError('Invalid address data'); - hash = _address().data; - } - - if (a.hash) { - if (hash.length > 0 && !hash.equals(a.hash)) throw new TypeError('Hash mismatch');else hash = a.hash; - } - - if (a.output) { - if (a.output.length !== 34 || a.output[0] !== OPS.OP_0 || a.output[1] !== 0x20) throw new TypeError('Output is invalid'); - var hash2 = a.output.slice(2); - if (hash.length > 0 && !hash.equals(hash2)) throw new TypeError('Hash mismatch');else hash = hash2; - } - - if (a.redeem) { - if (a.redeem.network && a.redeem.network !== network) throw new TypeError('Network mismatch'); // is there two redeem sources? - - if (a.redeem.input && a.redeem.input.length > 0 && a.redeem.witness && a.redeem.witness.length > 0) throw new TypeError('Ambiguous witness source'); // is the redeem output non-empty? - - if (a.redeem.output) { - if (bscript.decompile(a.redeem.output).length === 0) throw new TypeError('Redeem.output is invalid'); // match hash against other sources - - var _hash = bcrypto.sha256(a.redeem.output); - - if (hash.length > 0 && !hash.equals(_hash)) throw new TypeError('Hash mismatch');else hash = _hash; - } - - if (a.redeem.input && !bscript.isPushOnly(_rchunks())) throw new TypeError('Non push-only scriptSig'); - if (a.witness && a.redeem.witness && !stacksEqual(a.witness, a.redeem.witness)) throw new TypeError('Witness and redeem.witness mismatch'); - } - - if (a.witness) { - if (a.redeem && a.redeem.output && !a.redeem.output.equals(a.witness[a.witness.length - 1])) throw new TypeError('Witness and redeem.output mismatch'); - } - } - - return Object.assign(o, a); -} - -exports.p2wsh = p2wsh; -},{"../crypto":"uv3I","../networks":"rvS6","../script":"Fa8t","./lazy":"JBHK","typeforce":"PKU7","bech32":"gbth","buffer":"dskh"}],"kEsd":[function(require,module,exports) { -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var embed_1 = require('./embed'); - -exports.embed = embed_1.p2data; - -var p2ms_1 = require('./p2ms'); - -exports.p2ms = p2ms_1.p2ms; - -var p2pk_1 = require('./p2pk'); - -exports.p2pk = p2pk_1.p2pk; - -var p2pkh_1 = require('./p2pkh'); - -exports.p2pkh = p2pkh_1.p2pkh; - -var p2sh_1 = require('./p2sh'); - -exports.p2sh = p2sh_1.p2sh; - -var p2wpkh_1 = require('./p2wpkh'); - -exports.p2wpkh = p2wpkh_1.p2wpkh; - -var p2wsh_1 = require('./p2wsh'); - -exports.p2wsh = p2wsh_1.p2wsh; // TODO -// witness commitment -},{"./embed":"q7Hj","./p2ms":"SY7q","./p2pk":"jLkq","./p2pkh":"lzf5","./p2sh":"pamC","./p2wpkh":"ThHa","./p2wsh":"dY19"}],"wUUe":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var networks = require('./networks'); - -var payments = require('./payments'); - -var bscript = require('./script'); - -var types = require('./types'); - -var bech32 = require('bech32'); - -var bs58check = require('bs58check'); - -var typeforce = require('typeforce'); - -function fromBase58Check(address) { - var payload = bs58check.decode(address); // TODO: 4.0.0, move to "toOutputScript" - - if (payload.length < 21) throw new TypeError(address + ' is too short'); - if (payload.length > 21) throw new TypeError(address + ' is too long'); - var version = payload.readUInt8(0); - var hash = payload.slice(1); - return { - version: version, - hash: hash - }; -} - -exports.fromBase58Check = fromBase58Check; - -function fromBech32(address) { - var result = bech32.decode(address); - var data = bech32.fromWords(result.words.slice(1)); - return { - version: result.words[0], - prefix: result.prefix, - data: Buffer.from(data) - }; -} - -exports.fromBech32 = fromBech32; - -function toBase58Check(hash, version) { - typeforce(types.tuple(types.Hash160bit, types.UInt8), arguments); - var payload = Buffer.allocUnsafe(21); - payload.writeUInt8(version, 0); - hash.copy(payload, 1); - return bs58check.encode(payload); -} - -exports.toBase58Check = toBase58Check; - -function toBech32(data, version, prefix) { - var words = bech32.toWords(data); - words.unshift(version); - return bech32.encode(prefix, words); -} - -exports.toBech32 = toBech32; - -function fromOutputScript(output, network) { - // TODO: Network - network = network || networks.bitcoin; - - try { - return payments.p2pkh({ - output: output, - network: network - }).address; - } catch (e) {} - - try { - return payments.p2sh({ - output: output, - network: network - }).address; - } catch (e) {} - - try { - return payments.p2wpkh({ - output: output, - network: network - }).address; - } catch (e) {} - - try { - return payments.p2wsh({ - output: output, - network: network - }).address; - } catch (e) {} - - throw new Error(bscript.toASM(output) + ' has no matching Address'); -} - -exports.fromOutputScript = fromOutputScript; - -function toOutputScript(address, network) { - network = network || networks.bitcoin; - var decodeBase58; - var decodeBech32; - - try { - decodeBase58 = fromBase58Check(address); - } catch (e) {} - - if (decodeBase58) { - if (decodeBase58.version === network.pubKeyHash) return payments.p2pkh({ - hash: decodeBase58.hash - }).output; - if (decodeBase58.version === network.scriptHash) return payments.p2sh({ - hash: decodeBase58.hash - }).output; - } else { - try { - decodeBech32 = fromBech32(address); - } catch (e) {} - - if (decodeBech32) { - if (decodeBech32.prefix !== network.bech32) throw new Error(address + ' has an invalid prefix'); - - if (decodeBech32.version === 0) { - if (decodeBech32.data.length === 20) return payments.p2wpkh({ - hash: decodeBech32.data - }).output; - if (decodeBech32.data.length === 32) return payments.p2wsh({ - hash: decodeBech32.data - }).output; - } - } - } - - throw new Error(address + ' has no matching Script'); -} - -exports.toOutputScript = toOutputScript; -},{"./networks":"rvS6","./payments":"kEsd","./script":"Fa8t","./types":"TQ2w","bech32":"gbth","bs58check":"lJVR","typeforce":"PKU7","buffer":"dskh"}],"ZFsm":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var NETWORKS = require('./networks'); - -var types = require('./types'); - -var ecc = require('tiny-secp256k1'); - -var randomBytes = require('randombytes'); - -var typeforce = require('typeforce'); - -var wif = require('wif'); - -var isOptions = typeforce.maybe(typeforce.compile({ - compressed: types.maybe(types.Boolean), - network: types.maybe(types.Network) -})); - -var ECPair = -/*#__PURE__*/ -function () { - function ECPair(__D, __Q, options) { - _classCallCheck(this, ECPair); - - this.__D = __D; - this.__Q = __Q; - this.lowR = false; - if (options === undefined) options = {}; - this.compressed = options.compressed === undefined ? true : options.compressed; - this.network = options.network || NETWORKS.bitcoin; - if (__Q !== undefined) this.__Q = ecc.pointCompress(__Q, this.compressed); - } - - _createClass(ECPair, [{ - key: "toWIF", - value: function toWIF() { - if (!this.__D) throw new Error('Missing private key'); - return wif.encode(this.network.wif, this.__D, this.compressed); - } - }, { - key: "sign", - value: function sign(hash, lowR) { - if (!this.__D) throw new Error('Missing private key'); - if (lowR === undefined) lowR = this.lowR; - - if (lowR === false) { - return ecc.sign(hash, this.__D); - } else { - var sig = ecc.sign(hash, this.__D); - var extraData = Buffer.alloc(32, 0); - var counter = 0; // if first try is lowR, skip the loop - // for second try and on, add extra entropy counting up - - while (sig[0] > 0x7f) { - counter++; - extraData.writeUIntLE(counter, 0, 6); - sig = ecc.signWithEntropy(hash, this.__D, extraData); - } - - return sig; - } - } - }, { - key: "verify", - value: function verify(hash, signature) { - return ecc.verify(hash, this.publicKey, signature); - } - }, { - key: "privateKey", - get: function get() { - return this.__D; - } - }, { - key: "publicKey", - get: function get() { - if (!this.__Q) this.__Q = ecc.pointFromScalar(this.__D, this.compressed); - return this.__Q; - } - }]); - - return ECPair; -}(); - -function fromPrivateKey(buffer, options) { - typeforce(types.Buffer256bit, buffer); - if (!ecc.isPrivate(buffer)) throw new TypeError('Private key not in range [1, n)'); - typeforce(isOptions, options); - return new ECPair(buffer, undefined, options); -} - -exports.fromPrivateKey = fromPrivateKey; - -function fromPublicKey(buffer, options) { - typeforce(ecc.isPoint, buffer); - typeforce(isOptions, options); - return new ECPair(undefined, buffer, options); -} - -exports.fromPublicKey = fromPublicKey; - -function fromWIF(wifString, network) { - var decoded = wif.decode(wifString); - var version = decoded.version; // list of networks? - - if (types.Array(network)) { - network = network.filter(function (x) { - return version === x.wif; - }).pop(); - if (!network) throw new Error('Unknown network version'); // otherwise, assume a network object (or default to bitcoin) - } else { - network = network || NETWORKS.bitcoin; - if (version !== network.wif) throw new Error('Invalid network version'); - } - - return fromPrivateKey(decoded.privateKey, { - compressed: decoded.compressed, - network: network - }); -} - -exports.fromWIF = fromWIF; - -function makeRandom(options) { - typeforce(isOptions, options); - if (options === undefined) options = {}; - var rng = options.rng || randomBytes; - var d; - - do { - d = rng(32); - typeforce(types.Buffer256bit, d); - } while (!ecc.isPrivate(d)); - - return fromPrivateKey(d, options); -} - -exports.makeRandom = makeRandom; -},{"./networks":"rvS6","./types":"TQ2w","tiny-secp256k1":"fCMY","randombytes":"XJNj","typeforce":"PKU7","wif":"zCNS","buffer":"dskh"}],"jFwl":[function(require,module,exports) { -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); // https://github.com/feross/buffer/blob/master/index.js#L1127 - -function verifuint(value, max) { - if (typeof value !== 'number') throw new Error('cannot write a non-number as a number'); - if (value < 0) throw new Error('specified a negative value for writing an unsigned value'); - if (value > max) throw new Error('RangeError: value out of range'); - if (Math.floor(value) !== value) throw new Error('value has a fractional component'); -} - -function readUInt64LE(buffer, offset) { - var a = buffer.readUInt32LE(offset); - var b = buffer.readUInt32LE(offset + 4); - b *= 0x100000000; - verifuint(b + a, 0x001fffffffffffff); - return b + a; -} - -exports.readUInt64LE = readUInt64LE; - -function writeUInt64LE(buffer, value, offset) { - verifuint(value, 0x001fffffffffffff); - buffer.writeInt32LE(value & -1, offset); - buffer.writeUInt32LE(Math.floor(value / 0x100000000), offset + 4); - return offset + 8; -} - -exports.writeUInt64LE = writeUInt64LE; - -function reverseBuffer(buffer) { - if (buffer.length < 1) return buffer; - var j = buffer.length - 1; - var tmp = 0; - - for (var i = 0; i < buffer.length / 2; i++) { - tmp = buffer[i]; - buffer[i] = buffer[j]; - buffer[j] = tmp; - j--; - } - - return buffer; -} - -exports.reverseBuffer = reverseBuffer; -},{}],"xFE2":[function(require,module,exports) { - -'use strict' -var Buffer = require('safe-buffer').Buffer - -// Number.MAX_SAFE_INTEGER -var MAX_SAFE_INTEGER = 9007199254740991 - -function checkUInt53 (n) { - if (n < 0 || n > MAX_SAFE_INTEGER || n % 1 !== 0) throw new RangeError('value out of range') -} - -function encode (number, buffer, offset) { - checkUInt53(number) - - if (!buffer) buffer = Buffer.allocUnsafe(encodingLength(number)) - if (!Buffer.isBuffer(buffer)) throw new TypeError('buffer must be a Buffer instance') - if (!offset) offset = 0 - - // 8 bit - if (number < 0xfd) { - buffer.writeUInt8(number, offset) - encode.bytes = 1 - - // 16 bit - } else if (number <= 0xffff) { - buffer.writeUInt8(0xfd, offset) - buffer.writeUInt16LE(number, offset + 1) - encode.bytes = 3 - - // 32 bit - } else if (number <= 0xffffffff) { - buffer.writeUInt8(0xfe, offset) - buffer.writeUInt32LE(number, offset + 1) - encode.bytes = 5 - - // 64 bit - } else { - buffer.writeUInt8(0xff, offset) - buffer.writeUInt32LE(number >>> 0, offset + 1) - buffer.writeUInt32LE((number / 0x100000000) | 0, offset + 5) - encode.bytes = 9 - } - - return buffer -} - -function decode (buffer, offset) { - if (!Buffer.isBuffer(buffer)) throw new TypeError('buffer must be a Buffer instance') - if (!offset) offset = 0 - - var first = buffer.readUInt8(offset) - - // 8 bit - if (first < 0xfd) { - decode.bytes = 1 - return first - - // 16 bit - } else if (first === 0xfd) { - decode.bytes = 3 - return buffer.readUInt16LE(offset + 1) - - // 32 bit - } else if (first === 0xfe) { - decode.bytes = 5 - return buffer.readUInt32LE(offset + 1) - - // 64 bit - } else { - decode.bytes = 9 - var lo = buffer.readUInt32LE(offset + 1) - var hi = buffer.readUInt32LE(offset + 5) - var number = hi * 0x0100000000 + lo - checkUInt53(number) - - return number - } -} - -function encodingLength (number) { - checkUInt53(number) - - return ( - number < 0xfd ? 1 - : number <= 0xffff ? 3 - : number <= 0xffffffff ? 5 - : 9 - ) -} - -module.exports = { encode: encode, decode: decode, encodingLength: encodingLength } - -},{"safe-buffer":"Wugr"}],"Y9UO":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var bufferutils = require('./bufferutils'); - -var bufferutils_1 = require('./bufferutils'); - -var bcrypto = require('./crypto'); - -var bscript = require('./script'); - -var script_1 = require('./script'); - -var types = require('./types'); - -var typeforce = require('typeforce'); - -var varuint = require('varuint-bitcoin'); - -function varSliceSize(someScript) { - var length = someScript.length; - return varuint.encodingLength(length) + length; -} - -function vectorSize(someVector) { - var length = someVector.length; - return varuint.encodingLength(length) + someVector.reduce(function (sum, witness) { - return sum + varSliceSize(witness); - }, 0); -} - -var EMPTY_SCRIPT = Buffer.allocUnsafe(0); -var EMPTY_WITNESS = []; -var ZERO = Buffer.from('0000000000000000000000000000000000000000000000000000000000000000', 'hex'); -var ONE = Buffer.from('0000000000000000000000000000000000000000000000000000000000000001', 'hex'); -var VALUE_UINT64_MAX = Buffer.from('ffffffffffffffff', 'hex'); -var BLANK_OUTPUT = { - script: EMPTY_SCRIPT, - valueBuffer: VALUE_UINT64_MAX -}; - -function isOutput(out) { - return out.value !== undefined; -} - -var Transaction = -/*#__PURE__*/ -function () { - function Transaction() { - _classCallCheck(this, Transaction); - - this.version = 1; - this.locktime = 0; - this.ins = []; - this.outs = []; - } - - _createClass(Transaction, [{ - key: "isCoinbase", - value: function isCoinbase() { - return this.ins.length === 1 && Transaction.isCoinbaseHash(this.ins[0].hash); - } - }, { - key: "addInput", - value: function addInput(hash, index, sequence, scriptSig) { - typeforce(types.tuple(types.Hash256bit, types.UInt32, types.maybe(types.UInt32), types.maybe(types.Buffer)), arguments); - - if (types.Null(sequence)) { - sequence = Transaction.DEFAULT_SEQUENCE; - } // Add the input and return the input's index - - - return this.ins.push({ - hash: hash, - index: index, - script: scriptSig || EMPTY_SCRIPT, - sequence: sequence, - witness: EMPTY_WITNESS - }) - 1; - } - }, { - key: "addOutput", - value: function addOutput(scriptPubKey, value) { - typeforce(types.tuple(types.Buffer, types.Satoshi), arguments); // Add the output and return the output's index - - return this.outs.push({ - script: scriptPubKey, - value: value - }) - 1; - } - }, { - key: "hasWitnesses", - value: function hasWitnesses() { - return this.ins.some(function (x) { - return x.witness.length !== 0; - }); - } - }, { - key: "weight", - value: function weight() { - var base = this.__byteLength(false); - - var total = this.__byteLength(true); - - return base * 3 + total; - } - }, { - key: "virtualSize", - value: function virtualSize() { - return Math.ceil(this.weight() / 4); - } - }, { - key: "byteLength", - value: function byteLength() { - return this.__byteLength(true); - } - }, { - key: "clone", - value: function clone() { - var newTx = new Transaction(); - newTx.version = this.version; - newTx.locktime = this.locktime; - newTx.ins = this.ins.map(function (txIn) { - return { - hash: txIn.hash, - index: txIn.index, - script: txIn.script, - sequence: txIn.sequence, - witness: txIn.witness - }; - }); - newTx.outs = this.outs.map(function (txOut) { - return { - script: txOut.script, - value: txOut.value - }; - }); - return newTx; - } - /** - * Hash transaction for signing a specific input. - * - * Bitcoin uses a different hash for each signed transaction input. - * This method copies the transaction, makes the necessary changes based on the - * hashType, and then hashes the result. - * This hash can then be used to sign the provided transaction input. - */ - - }, { - key: "hashForSignature", - value: function hashForSignature(inIndex, prevOutScript, hashType) { - typeforce(types.tuple(types.UInt32, types.Buffer, - /* types.UInt8 */ - types.Number), arguments); // https://github.com/bitcoin/bitcoin/blob/master/src/test/sighash_tests.cpp#L29 - - if (inIndex >= this.ins.length) return ONE; // ignore OP_CODESEPARATOR - - var ourScript = bscript.compile(bscript.decompile(prevOutScript).filter(function (x) { - return x !== script_1.OPS.OP_CODESEPARATOR; - })); - var txTmp = this.clone(); // SIGHASH_NONE: ignore all outputs? (wildcard payee) - - if ((hashType & 0x1f) === Transaction.SIGHASH_NONE) { - txTmp.outs = []; // ignore sequence numbers (except at inIndex) - - txTmp.ins.forEach(function (input, i) { - if (i === inIndex) return; - input.sequence = 0; - }); // SIGHASH_SINGLE: ignore all outputs, except at the same index? - } else if ((hashType & 0x1f) === Transaction.SIGHASH_SINGLE) { - // https://github.com/bitcoin/bitcoin/blob/master/src/test/sighash_tests.cpp#L60 - if (inIndex >= this.outs.length) return ONE; // truncate outputs after - - txTmp.outs.length = inIndex + 1; // "blank" outputs before - - for (var i = 0; i < inIndex; i++) { - txTmp.outs[i] = BLANK_OUTPUT; - } // ignore sequence numbers (except at inIndex) - - - txTmp.ins.forEach(function (input, y) { - if (y === inIndex) return; - input.sequence = 0; - }); - } // SIGHASH_ANYONECANPAY: ignore inputs entirely? - - - if (hashType & Transaction.SIGHASH_ANYONECANPAY) { - txTmp.ins = [txTmp.ins[inIndex]]; - txTmp.ins[0].script = ourScript; // SIGHASH_ALL: only ignore input scripts - } else { - // "blank" others input scripts - txTmp.ins.forEach(function (input) { - input.script = EMPTY_SCRIPT; - }); - txTmp.ins[inIndex].script = ourScript; - } // serialize and hash - - - var buffer = Buffer.allocUnsafe(txTmp.__byteLength(false) + 4); - buffer.writeInt32LE(hashType, buffer.length - 4); - - txTmp.__toBuffer(buffer, 0, false); - - return bcrypto.hash256(buffer); - } - }, { - key: "hashForWitnessV0", - value: function hashForWitnessV0(inIndex, prevOutScript, value, hashType) { - typeforce(types.tuple(types.UInt32, types.Buffer, types.Satoshi, types.UInt32), arguments); - var tbuffer = Buffer.from([]); - var toffset = 0; - - function writeSlice(slice) { - toffset += slice.copy(tbuffer, toffset); - } - - function writeUInt32(i) { - toffset = tbuffer.writeUInt32LE(i, toffset); - } - - function writeUInt64(i) { - toffset = bufferutils.writeUInt64LE(tbuffer, i, toffset); - } - - function writeVarInt(i) { - varuint.encode(i, tbuffer, toffset); - toffset += varuint.encode.bytes; - } - - function writeVarSlice(slice) { - writeVarInt(slice.length); - writeSlice(slice); - } - - var hashOutputs = ZERO; - var hashPrevouts = ZERO; - var hashSequence = ZERO; - - if (!(hashType & Transaction.SIGHASH_ANYONECANPAY)) { - tbuffer = Buffer.allocUnsafe(36 * this.ins.length); - toffset = 0; - this.ins.forEach(function (txIn) { - writeSlice(txIn.hash); - writeUInt32(txIn.index); - }); - hashPrevouts = bcrypto.hash256(tbuffer); - } - - if (!(hashType & Transaction.SIGHASH_ANYONECANPAY) && (hashType & 0x1f) !== Transaction.SIGHASH_SINGLE && (hashType & 0x1f) !== Transaction.SIGHASH_NONE) { - tbuffer = Buffer.allocUnsafe(4 * this.ins.length); - toffset = 0; - this.ins.forEach(function (txIn) { - writeUInt32(txIn.sequence); - }); - hashSequence = bcrypto.hash256(tbuffer); - } - - if ((hashType & 0x1f) !== Transaction.SIGHASH_SINGLE && (hashType & 0x1f) !== Transaction.SIGHASH_NONE) { - var txOutsSize = this.outs.reduce(function (sum, output) { - return sum + 8 + varSliceSize(output.script); - }, 0); - tbuffer = Buffer.allocUnsafe(txOutsSize); - toffset = 0; - this.outs.forEach(function (out) { - writeUInt64(out.value); - writeVarSlice(out.script); - }); - hashOutputs = bcrypto.hash256(tbuffer); - } else if ((hashType & 0x1f) === Transaction.SIGHASH_SINGLE && inIndex < this.outs.length) { - var output = this.outs[inIndex]; - tbuffer = Buffer.allocUnsafe(8 + varSliceSize(output.script)); - toffset = 0; - writeUInt64(output.value); - writeVarSlice(output.script); - hashOutputs = bcrypto.hash256(tbuffer); - } - - tbuffer = Buffer.allocUnsafe(156 + varSliceSize(prevOutScript)); - toffset = 0; - var input = this.ins[inIndex]; - writeUInt32(this.version); - writeSlice(hashPrevouts); - writeSlice(hashSequence); - writeSlice(input.hash); - writeUInt32(input.index); - writeVarSlice(prevOutScript); - writeUInt64(value); - writeUInt32(input.sequence); - writeSlice(hashOutputs); - writeUInt32(this.locktime); - writeUInt32(hashType); - return bcrypto.hash256(tbuffer); - } - }, { - key: "getHash", - value: function getHash(forWitness) { - // wtxid for coinbase is always 32 bytes of 0x00 - if (forWitness && this.isCoinbase()) return Buffer.alloc(32, 0); - return bcrypto.hash256(this.__toBuffer(undefined, undefined, forWitness)); - } - }, { - key: "getId", - value: function getId() { - // transaction hash's are displayed in reverse order - return bufferutils_1.reverseBuffer(this.getHash(false)).toString('hex'); - } - }, { - key: "toBuffer", - value: function toBuffer(buffer, initialOffset) { - return this.__toBuffer(buffer, initialOffset, true); - } - }, { - key: "toHex", - value: function toHex() { - return this.toBuffer(undefined, undefined).toString('hex'); - } - }, { - key: "setInputScript", - value: function setInputScript(index, scriptSig) { - typeforce(types.tuple(types.Number, types.Buffer), arguments); - this.ins[index].script = scriptSig; - } - }, { - key: "setWitness", - value: function setWitness(index, witness) { - typeforce(types.tuple(types.Number, [types.Buffer]), arguments); - this.ins[index].witness = witness; - } - }, { - key: "__byteLength", - value: function __byteLength(_ALLOW_WITNESS) { - var hasWitnesses = _ALLOW_WITNESS && this.hasWitnesses(); - - return (hasWitnesses ? 10 : 8) + varuint.encodingLength(this.ins.length) + varuint.encodingLength(this.outs.length) + this.ins.reduce(function (sum, input) { - return sum + 40 + varSliceSize(input.script); - }, 0) + this.outs.reduce(function (sum, output) { - return sum + 8 + varSliceSize(output.script); - }, 0) + (hasWitnesses ? this.ins.reduce(function (sum, input) { - return sum + vectorSize(input.witness); - }, 0) : 0); - } - }, { - key: "__toBuffer", - value: function __toBuffer(buffer, initialOffset, _ALLOW_WITNESS) { - if (!buffer) buffer = Buffer.allocUnsafe(this.__byteLength(_ALLOW_WITNESS)); - var offset = initialOffset || 0; - - function writeSlice(slice) { - offset += slice.copy(buffer, offset); - } - - function writeUInt8(i) { - offset = buffer.writeUInt8(i, offset); - } - - function writeUInt32(i) { - offset = buffer.writeUInt32LE(i, offset); - } - - function writeInt32(i) { - offset = buffer.writeInt32LE(i, offset); - } - - function writeUInt64(i) { - offset = bufferutils.writeUInt64LE(buffer, i, offset); - } - - function writeVarInt(i) { - varuint.encode(i, buffer, offset); - offset += varuint.encode.bytes; - } - - function writeVarSlice(slice) { - writeVarInt(slice.length); - writeSlice(slice); - } - - function writeVector(vector) { - writeVarInt(vector.length); - vector.forEach(writeVarSlice); - } - - writeInt32(this.version); - - var hasWitnesses = _ALLOW_WITNESS && this.hasWitnesses(); - - if (hasWitnesses) { - writeUInt8(Transaction.ADVANCED_TRANSACTION_MARKER); - writeUInt8(Transaction.ADVANCED_TRANSACTION_FLAG); - } - - writeVarInt(this.ins.length); - this.ins.forEach(function (txIn) { - writeSlice(txIn.hash); - writeUInt32(txIn.index); - writeVarSlice(txIn.script); - writeUInt32(txIn.sequence); - }); - writeVarInt(this.outs.length); - this.outs.forEach(function (txOut) { - if (isOutput(txOut)) { - writeUInt64(txOut.value); - } else { - writeSlice(txOut.valueBuffer); - } - - writeVarSlice(txOut.script); - }); - - if (hasWitnesses) { - this.ins.forEach(function (input) { - writeVector(input.witness); - }); - } - - writeUInt32(this.locktime); // avoid slicing unless necessary - - if (initialOffset !== undefined) return buffer.slice(initialOffset, offset); - return buffer; - } - }], [{ - key: "fromBuffer", - value: function fromBuffer(buffer, _NO_STRICT) { - var offset = 0; - - function readSlice(n) { - offset += n; - return buffer.slice(offset - n, offset); - } - - function readUInt32() { - var i = buffer.readUInt32LE(offset); - offset += 4; - return i; - } - - function readInt32() { - var i = buffer.readInt32LE(offset); - offset += 4; - return i; - } - - function readUInt64() { - var i = bufferutils.readUInt64LE(buffer, offset); - offset += 8; - return i; - } - - function readVarInt() { - var vi = varuint.decode(buffer, offset); - offset += varuint.decode.bytes; - return vi; - } - - function readVarSlice() { - return readSlice(readVarInt()); - } - - function readVector() { - var count = readVarInt(); - var vector = []; - - for (var i = 0; i < count; i++) { - vector.push(readVarSlice()); - } - - return vector; - } - - var tx = new Transaction(); - tx.version = readInt32(); - var marker = buffer.readUInt8(offset); - var flag = buffer.readUInt8(offset + 1); - var hasWitnesses = false; - - if (marker === Transaction.ADVANCED_TRANSACTION_MARKER && flag === Transaction.ADVANCED_TRANSACTION_FLAG) { - offset += 2; - hasWitnesses = true; - } - - var vinLen = readVarInt(); - - for (var i = 0; i < vinLen; ++i) { - tx.ins.push({ - hash: readSlice(32), - index: readUInt32(), - script: readVarSlice(), - sequence: readUInt32(), - witness: EMPTY_WITNESS - }); - } - - var voutLen = readVarInt(); - - for (var _i = 0; _i < voutLen; ++_i) { - tx.outs.push({ - value: readUInt64(), - script: readVarSlice() - }); - } - - if (hasWitnesses) { - for (var _i2 = 0; _i2 < vinLen; ++_i2) { - tx.ins[_i2].witness = readVector(); - } // was this pointless? - - - if (!tx.hasWitnesses()) throw new Error('Transaction has superfluous witness data'); - } - - tx.locktime = readUInt32(); - if (_NO_STRICT) return tx; - if (offset !== buffer.length) throw new Error('Transaction has unexpected data'); - return tx; - } - }, { - key: "fromHex", - value: function fromHex(hex) { - return Transaction.fromBuffer(Buffer.from(hex, 'hex'), false); - } - }, { - key: "isCoinbaseHash", - value: function isCoinbaseHash(buffer) { - typeforce(types.Hash256bit, buffer); - - for (var i = 0; i < 32; ++i) { - if (buffer[i] !== 0) return false; - } - - return true; - } - }]); - - return Transaction; -}(); - -Transaction.DEFAULT_SEQUENCE = 0xffffffff; -Transaction.SIGHASH_ALL = 0x01; -Transaction.SIGHASH_NONE = 0x02; -Transaction.SIGHASH_SINGLE = 0x03; -Transaction.SIGHASH_ANYONECANPAY = 0x80; -Transaction.ADVANCED_TRANSACTION_MARKER = 0x00; -Transaction.ADVANCED_TRANSACTION_FLAG = 0x01; -exports.Transaction = Transaction; -},{"./bufferutils":"jFwl","./crypto":"uv3I","./script":"Fa8t","./types":"TQ2w","typeforce":"PKU7","varuint-bitcoin":"xFE2","buffer":"dskh"}],"DNBG":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -// constant-space merkle root calculation algorithm -module.exports = function fastRoot (values, digestFn) { - if (!Array.isArray(values)) throw TypeError('Expected values Array') - if (typeof digestFn !== 'function') throw TypeError('Expected digest Function') - - var length = values.length - var results = values.concat() - - while (length > 1) { - var j = 0 - - for (var i = 0; i < length; i += 2, ++j) { - var left = results[i] - var right = i + 1 === length ? left : results[i + 1] - var data = Buffer.concat([left, right]) - - results[j] = digestFn(data) - } - - length = j - } - - return results[0] -} - -},{"buffer":"dskh"}],"lHho":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var bufferutils_1 = require('./bufferutils'); - -var bcrypto = require('./crypto'); - -var transaction_1 = require('./transaction'); - -var types = require('./types'); - -var fastMerkleRoot = require('merkle-lib/fastRoot'); - -var typeforce = require('typeforce'); - -var varuint = require('varuint-bitcoin'); - -var errorMerkleNoTxes = new TypeError('Cannot compute merkle root for zero transactions'); -var errorWitnessNotSegwit = new TypeError('Cannot compute witness commit for non-segwit block'); - -var Block = -/*#__PURE__*/ -function () { - function Block() { - _classCallCheck(this, Block); - - this.version = 1; - this.prevHash = undefined; - this.merkleRoot = undefined; - this.timestamp = 0; - this.witnessCommit = undefined; - this.bits = 0; - this.nonce = 0; - this.transactions = undefined; - } - - _createClass(Block, [{ - key: "getWitnessCommit", - value: function getWitnessCommit() { - if (!txesHaveWitnessCommit(this.transactions)) return null; // The merkle root for the witness data is in an OP_RETURN output. - // There is no rule for the index of the output, so use filter to find it. - // The root is prepended with 0xaa21a9ed so check for 0x6a24aa21a9ed - // If multiple commits are found, the output with highest index is assumed. - - var witnessCommits = this.transactions[0].outs.filter(function (out) { - return out.script.slice(0, 6).equals(Buffer.from('6a24aa21a9ed', 'hex')); - }).map(function (out) { - return out.script.slice(6, 38); - }); - if (witnessCommits.length === 0) return null; // Use the commit with the highest output (should only be one though) - - var result = witnessCommits[witnessCommits.length - 1]; - if (!(result instanceof Buffer && result.length === 32)) return null; - return result; - } - }, { - key: "hasWitnessCommit", - value: function hasWitnessCommit() { - if (this.witnessCommit instanceof Buffer && this.witnessCommit.length === 32) return true; - if (this.getWitnessCommit() !== null) return true; - return false; - } - }, { - key: "hasWitness", - value: function hasWitness() { - return anyTxHasWitness(this.transactions); - } - }, { - key: "byteLength", - value: function byteLength(headersOnly) { - if (headersOnly || !this.transactions) return 80; - return 80 + varuint.encodingLength(this.transactions.length) + this.transactions.reduce(function (a, x) { - return a + x.byteLength(); - }, 0); - } - }, { - key: "getHash", - value: function getHash() { - return bcrypto.hash256(this.toBuffer(true)); - } - }, { - key: "getId", - value: function getId() { - return bufferutils_1.reverseBuffer(this.getHash()).toString('hex'); - } - }, { - key: "getUTCDate", - value: function getUTCDate() { - var date = new Date(0); // epoch - - date.setUTCSeconds(this.timestamp); - return date; - } // TODO: buffer, offset compatibility - - }, { - key: "toBuffer", - value: function toBuffer(headersOnly) { - var buffer = Buffer.allocUnsafe(this.byteLength(headersOnly)); - var offset = 0; - - var writeSlice = function writeSlice(slice) { - slice.copy(buffer, offset); - offset += slice.length; - }; - - var writeInt32 = function writeInt32(i) { - buffer.writeInt32LE(i, offset); - offset += 4; - }; - - var writeUInt32 = function writeUInt32(i) { - buffer.writeUInt32LE(i, offset); - offset += 4; - }; - - writeInt32(this.version); - writeSlice(this.prevHash); - writeSlice(this.merkleRoot); - writeUInt32(this.timestamp); - writeUInt32(this.bits); - writeUInt32(this.nonce); - if (headersOnly || !this.transactions) return buffer; - varuint.encode(this.transactions.length, buffer, offset); - offset += varuint.encode.bytes; - this.transactions.forEach(function (tx) { - var txSize = tx.byteLength(); // TODO: extract from toBuffer? - - tx.toBuffer(buffer, offset); - offset += txSize; - }); - return buffer; - } - }, { - key: "toHex", - value: function toHex(headersOnly) { - return this.toBuffer(headersOnly).toString('hex'); - } - }, { - key: "checkTxRoots", - value: function checkTxRoots() { - // If the Block has segwit transactions but no witness commit, - // there's no way it can be valid, so fail the check. - var hasWitnessCommit = this.hasWitnessCommit(); - if (!hasWitnessCommit && this.hasWitness()) return false; - return this.__checkMerkleRoot() && (hasWitnessCommit ? this.__checkWitnessCommit() : true); - } - }, { - key: "checkProofOfWork", - value: function checkProofOfWork() { - var hash = bufferutils_1.reverseBuffer(this.getHash()); - var target = Block.calculateTarget(this.bits); - return hash.compare(target) <= 0; - } - }, { - key: "__checkMerkleRoot", - value: function __checkMerkleRoot() { - if (!this.transactions) throw errorMerkleNoTxes; - var actualMerkleRoot = Block.calculateMerkleRoot(this.transactions); - return this.merkleRoot.compare(actualMerkleRoot) === 0; - } - }, { - key: "__checkWitnessCommit", - value: function __checkWitnessCommit() { - if (!this.transactions) throw errorMerkleNoTxes; - if (!this.hasWitnessCommit()) throw errorWitnessNotSegwit; - var actualWitnessCommit = Block.calculateMerkleRoot(this.transactions, true); - return this.witnessCommit.compare(actualWitnessCommit) === 0; - } - }], [{ - key: "fromBuffer", - value: function fromBuffer(buffer) { - if (buffer.length < 80) throw new Error('Buffer too small (< 80 bytes)'); - var offset = 0; - - var readSlice = function readSlice(n) { - offset += n; - return buffer.slice(offset - n, offset); - }; - - var readUInt32 = function readUInt32() { - var i = buffer.readUInt32LE(offset); - offset += 4; - return i; - }; - - var readInt32 = function readInt32() { - var i = buffer.readInt32LE(offset); - offset += 4; - return i; - }; - - var block = new Block(); - block.version = readInt32(); - block.prevHash = readSlice(32); - block.merkleRoot = readSlice(32); - block.timestamp = readUInt32(); - block.bits = readUInt32(); - block.nonce = readUInt32(); - if (buffer.length === 80) return block; - - var readVarInt = function readVarInt() { - var vi = varuint.decode(buffer, offset); - offset += varuint.decode.bytes; - return vi; - }; - - var readTransaction = function readTransaction() { - var tx = transaction_1.Transaction.fromBuffer(buffer.slice(offset), true); - offset += tx.byteLength(); - return tx; - }; - - var nTransactions = readVarInt(); - block.transactions = []; - - for (var i = 0; i < nTransactions; ++i) { - var tx = readTransaction(); - block.transactions.push(tx); - } - - var witnessCommit = block.getWitnessCommit(); // This Block contains a witness commit - - if (witnessCommit) block.witnessCommit = witnessCommit; - return block; - } - }, { - key: "fromHex", - value: function fromHex(hex) { - return Block.fromBuffer(Buffer.from(hex, 'hex')); - } - }, { - key: "calculateTarget", - value: function calculateTarget(bits) { - var exponent = ((bits & 0xff000000) >> 24) - 3; - var mantissa = bits & 0x007fffff; - var target = Buffer.alloc(32, 0); - target.writeUIntBE(mantissa, 29 - exponent, 3); - return target; - } - }, { - key: "calculateMerkleRoot", - value: function calculateMerkleRoot(transactions, forWitness) { - typeforce([{ - getHash: types.Function - }], transactions); - if (transactions.length === 0) throw errorMerkleNoTxes; - if (forWitness && !txesHaveWitnessCommit(transactions)) throw errorWitnessNotSegwit; - var hashes = transactions.map(function (transaction) { - return transaction.getHash(forWitness); - }); - var rootHash = fastMerkleRoot(hashes, bcrypto.hash256); - return forWitness ? bcrypto.hash256(Buffer.concat([rootHash, transactions[0].ins[0].witness[0]])) : rootHash; - } - }]); - - return Block; -}(); - -exports.Block = Block; - -function txesHaveWitnessCommit(transactions) { - return transactions instanceof Array && transactions[0] && transactions[0].ins && transactions[0].ins instanceof Array && transactions[0].ins[0] && transactions[0].ins[0].witness && transactions[0].ins[0].witness instanceof Array && transactions[0].ins[0].witness.length > 0; -} - -function anyTxHasWitness(transactions) { - return transactions instanceof Array && transactions.some(function (tx) { - return _typeof(tx) === 'object' && tx.ins instanceof Array && tx.ins.some(function (input) { - return _typeof(input) === 'object' && input.witness instanceof Array && input.witness.length > 0; - }); - }); -} -},{"./bufferutils":"jFwl","./crypto":"uv3I","./transaction":"Y9UO","./types":"TQ2w","merkle-lib/fastRoot":"DNBG","typeforce":"PKU7","varuint-bitcoin":"xFE2","buffer":"dskh"}],"TcPe":[function(require,module,exports) { -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); -var GlobalTypes; - -(function (GlobalTypes) { - GlobalTypes[GlobalTypes['UNSIGNED_TX'] = 0] = 'UNSIGNED_TX'; - GlobalTypes[GlobalTypes['GLOBAL_XPUB'] = 1] = 'GLOBAL_XPUB'; -})(GlobalTypes = exports.GlobalTypes || (exports.GlobalTypes = {})); - -exports.GLOBAL_TYPE_NAMES = ['unsignedTx', 'globalXpub']; -var InputTypes; - -(function (InputTypes) { - InputTypes[InputTypes['NON_WITNESS_UTXO'] = 0] = 'NON_WITNESS_UTXO'; - InputTypes[InputTypes['WITNESS_UTXO'] = 1] = 'WITNESS_UTXO'; - InputTypes[InputTypes['PARTIAL_SIG'] = 2] = 'PARTIAL_SIG'; - InputTypes[InputTypes['SIGHASH_TYPE'] = 3] = 'SIGHASH_TYPE'; - InputTypes[InputTypes['REDEEM_SCRIPT'] = 4] = 'REDEEM_SCRIPT'; - InputTypes[InputTypes['WITNESS_SCRIPT'] = 5] = 'WITNESS_SCRIPT'; - InputTypes[InputTypes['BIP32_DERIVATION'] = 6] = 'BIP32_DERIVATION'; - InputTypes[InputTypes['FINAL_SCRIPTSIG'] = 7] = 'FINAL_SCRIPTSIG'; - InputTypes[InputTypes['FINAL_SCRIPTWITNESS'] = 8] = 'FINAL_SCRIPTWITNESS'; - InputTypes[InputTypes['POR_COMMITMENT'] = 9] = 'POR_COMMITMENT'; -})(InputTypes = exports.InputTypes || (exports.InputTypes = {})); - -exports.INPUT_TYPE_NAMES = ['nonWitnessUtxo', 'witnessUtxo', 'partialSig', 'sighashType', 'redeemScript', 'witnessScript', 'bip32Derivation', 'finalScriptSig', 'finalScriptWitness', 'porCommitment']; -var OutputTypes; - -(function (OutputTypes) { - OutputTypes[OutputTypes['REDEEM_SCRIPT'] = 0] = 'REDEEM_SCRIPT'; - OutputTypes[OutputTypes['WITNESS_SCRIPT'] = 1] = 'WITNESS_SCRIPT'; - OutputTypes[OutputTypes['BIP32_DERIVATION'] = 2] = 'BIP32_DERIVATION'; -})(OutputTypes = exports.OutputTypes || (exports.OutputTypes = {})); - -exports.OUTPUT_TYPE_NAMES = ['redeemScript', 'witnessScript', 'bip32Derivation']; -},{}],"vGPv":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } - -function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } - -function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } - -function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var typeFields_1 = require('../../typeFields'); - -var range = function range(n) { - return _toConsumableArray(Array(n).keys()); -}; - -function decode(keyVal) { - if (keyVal.key[0] !== typeFields_1.GlobalTypes.GLOBAL_XPUB) { - throw new Error('Decode Error: could not decode globalXpub with key 0x' + keyVal.key.toString('hex')); - } - - if (keyVal.key.length !== 79 || ![2, 3].includes(keyVal.key[46])) { - throw new Error('Decode Error: globalXpub has invalid extended pubkey in key 0x' + keyVal.key.toString('hex')); - } - - if (keyVal.value.length / 4 % 1 !== 0) { - throw new Error('Decode Error: Global GLOBAL_XPUB value length should be multiple of 4'); - } - - var extendedPubkey = keyVal.key.slice(1); - var data = { - masterFingerprint: keyVal.value.slice(0, 4), - extendedPubkey: extendedPubkey, - path: 'm' - }; - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = range(keyVal.value.length / 4 - 1)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var i = _step.value; - var val = keyVal.value.readUInt32LE(i * 4 + 4); - var isHard = !!(val & 0x80000000); - var idx = val & 0x7fffffff; - data.path += '/' + idx.toString(10) + (isHard ? "'" : ''); - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return != null) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } - - return data; -} - -exports.decode = decode; - -function encode(data) { - var head = Buffer.from([typeFields_1.GlobalTypes.GLOBAL_XPUB]); - var key = Buffer.concat([head, data.extendedPubkey]); - var splitPath = data.path.split('/'); - var value = Buffer.allocUnsafe(splitPath.length * 4); - data.masterFingerprint.copy(value, 0); - var offset = 4; - splitPath.slice(1).forEach(function (level) { - var isHard = level.slice(-1) === "'"; - var num = 0x7fffffff & parseInt(isHard ? level.slice(0, -1) : level, 10); - if (isHard) num += 0x80000000; - value.writeUInt32LE(num, offset); - offset += 4; - }); - return { - key: key, - value: value - }; -} - -exports.encode = encode; -exports.expected = '{ masterFingerprint: Buffer; extendedPubkey: Buffer; path: string; }'; - -function check(data) { - var epk = data.extendedPubkey; - var mfp = data.masterFingerprint; - var p = data.path; - return Buffer.isBuffer(epk) && epk.length === 78 && [2, 3].indexOf(epk[45]) > -1 && Buffer.isBuffer(mfp) && mfp.length === 4 && typeof p === 'string' && !!p.match(/^m(\/\d+'?)+$/); -} - -exports.check = check; - -function canAddToArray(array, item, dupeSet) { - var dupeString = item.extendedPubkey.toString('hex'); - if (dupeSet.has(dupeString)) return false; - dupeSet.add(dupeString); - return array.filter(function (v) { - return v.extendedPubkey.equals(item.extendedPubkey); - }).length === 0; -} - -exports.canAddToArray = canAddToArray; -},{"../../typeFields":"TcPe","buffer":"dskh"}],"KAzb":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var typeFields_1 = require('../../typeFields'); - -function encode(data) { - return { - key: Buffer.from([typeFields_1.GlobalTypes.UNSIGNED_TX]), - value: data.toBuffer() - }; -} - -exports.encode = encode; -},{"../../typeFields":"TcPe","buffer":"dskh"}],"ktbP":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var typeFields_1 = require('../../typeFields'); - -function decode(keyVal) { - if (keyVal.key[0] !== typeFields_1.InputTypes.FINAL_SCRIPTSIG) { - throw new Error('Decode Error: could not decode finalScriptSig with key 0x' + keyVal.key.toString('hex')); - } - - return keyVal.value; -} - -exports.decode = decode; - -function encode(data) { - var key = Buffer.from([typeFields_1.InputTypes.FINAL_SCRIPTSIG]); - return { - key: key, - value: data - }; -} - -exports.encode = encode; -exports.expected = 'Buffer'; - -function check(data) { - return Buffer.isBuffer(data); -} - -exports.check = check; - -function canAdd(currentData, newData) { - return !!currentData && !!newData && currentData.finalScriptSig === undefined; -} - -exports.canAdd = canAdd; -},{"../../typeFields":"TcPe","buffer":"dskh"}],"rKOF":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var typeFields_1 = require('../../typeFields'); - -function decode(keyVal) { - if (keyVal.key[0] !== typeFields_1.InputTypes.FINAL_SCRIPTWITNESS) { - throw new Error('Decode Error: could not decode finalScriptWitness with key 0x' + keyVal.key.toString('hex')); - } - - return keyVal.value; -} - -exports.decode = decode; - -function encode(data) { - var key = Buffer.from([typeFields_1.InputTypes.FINAL_SCRIPTWITNESS]); - return { - key: key, - value: data - }; -} - -exports.encode = encode; -exports.expected = 'Buffer'; - -function check(data) { - return Buffer.isBuffer(data); -} - -exports.check = check; - -function canAdd(currentData, newData) { - return !!currentData && !!newData && currentData.finalScriptWitness === undefined; -} - -exports.canAdd = canAdd; -},{"../../typeFields":"TcPe","buffer":"dskh"}],"suxJ":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var typeFields_1 = require('../../typeFields'); - -function decode(keyVal) { - if (keyVal.key[0] !== typeFields_1.InputTypes.NON_WITNESS_UTXO) { - throw new Error('Decode Error: could not decode nonWitnessUtxo with key 0x' + keyVal.key.toString('hex')); - } - - return keyVal.value; -} - -exports.decode = decode; - -function encode(data) { - return { - key: Buffer.from([typeFields_1.InputTypes.NON_WITNESS_UTXO]), - value: data - }; -} - -exports.encode = encode; -exports.expected = 'Buffer'; - -function check(data) { - return Buffer.isBuffer(data); -} - -exports.check = check; - -function canAdd(currentData, newData) { - return !!currentData && !!newData && currentData.witnessUtxo === undefined && currentData.nonWitnessUtxo === undefined; -} - -exports.canAdd = canAdd; -},{"../../typeFields":"TcPe","buffer":"dskh"}],"DQOH":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var typeFields_1 = require('../../typeFields'); - -function decode(keyVal) { - if (keyVal.key[0] !== typeFields_1.InputTypes.PARTIAL_SIG) { - throw new Error('Decode Error: could not decode partialSig with key 0x' + keyVal.key.toString('hex')); - } - - if (!(keyVal.key.length === 34 || keyVal.key.length === 66) || ![2, 3, 4].includes(keyVal.key[1])) { - throw new Error('Decode Error: partialSig has invalid pubkey in key 0x' + keyVal.key.toString('hex')); - } - - var pubkey = keyVal.key.slice(1); - return { - pubkey: pubkey, - signature: keyVal.value - }; -} - -exports.decode = decode; - -function encode(pSig) { - var head = Buffer.from([typeFields_1.InputTypes.PARTIAL_SIG]); - return { - key: Buffer.concat([head, pSig.pubkey]), - value: pSig.signature - }; -} - -exports.encode = encode; -exports.expected = '{ pubkey: Buffer; signature: Buffer; }'; - -function check(data) { - return Buffer.isBuffer(data.pubkey) && Buffer.isBuffer(data.signature) && [33, 65].includes(data.pubkey.length) && [2, 3, 4].includes(data.pubkey[0]) && isDerSigWithSighash(data.signature); -} - -exports.check = check; - -function isDerSigWithSighash(buf) { - if (!Buffer.isBuffer(buf) || buf.length < 9) return false; - if (buf[0] !== 0x30) return false; - if (buf.length !== buf[1] + 3) return false; - if (buf[2] !== 0x02) return false; - var rLen = buf[3]; - if (rLen > 33 || rLen < 1) return false; - if (buf[3 + rLen + 1] !== 0x02) return false; - var sLen = buf[3 + rLen + 2]; - if (sLen > 33 || sLen < 1) return false; - if (buf.length !== 3 + rLen + 2 + sLen + 2) return false; - return true; -} - -function canAddToArray(array, item, dupeSet) { - var dupeString = item.pubkey.toString('hex'); - if (dupeSet.has(dupeString)) return false; - dupeSet.add(dupeString); - return array.filter(function (v) { - return v.pubkey.equals(item.pubkey); - }).length === 0; -} - -exports.canAddToArray = canAddToArray; -},{"../../typeFields":"TcPe","buffer":"dskh"}],"N7P5":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var typeFields_1 = require('../../typeFields'); - -function decode(keyVal) { - if (keyVal.key[0] !== typeFields_1.InputTypes.POR_COMMITMENT) { - throw new Error('Decode Error: could not decode porCommitment with key 0x' + keyVal.key.toString('hex')); - } - - return keyVal.value.toString('utf8'); -} - -exports.decode = decode; - -function encode(data) { - var key = Buffer.from([typeFields_1.InputTypes.POR_COMMITMENT]); - return { - key: key, - value: Buffer.from(data, 'utf8') - }; -} - -exports.encode = encode; -exports.expected = 'string'; - -function check(data) { - return typeof data === 'string'; -} - -exports.check = check; - -function canAdd(currentData, newData) { - return !!currentData && !!newData && currentData.porCommitment === undefined; -} - -exports.canAdd = canAdd; -},{"../../typeFields":"TcPe","buffer":"dskh"}],"b4tW":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var typeFields_1 = require('../../typeFields'); - -function decode(keyVal) { - if (keyVal.key[0] !== typeFields_1.InputTypes.SIGHASH_TYPE) { - throw new Error('Decode Error: could not decode sighashType with key 0x' + keyVal.key.toString('hex')); - } - - return keyVal.value.readUInt32LE(0); -} - -exports.decode = decode; - -function encode(data) { - var key = Buffer.from([typeFields_1.InputTypes.SIGHASH_TYPE]); - var value = Buffer.allocUnsafe(4); - value.writeUInt32LE(data, 0); - return { - key: key, - value: value - }; -} - -exports.encode = encode; -exports.expected = 'number'; - -function check(data) { - return typeof data === 'number'; -} - -exports.check = check; - -function canAdd(currentData, newData) { - return !!currentData && !!newData && currentData.sighashType === undefined; -} - -exports.canAdd = canAdd; -},{"../../typeFields":"TcPe","buffer":"dskh"}],"ViXA":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); // Number.MAX_SAFE_INTEGER - -var MAX_SAFE_INTEGER = 9007199254740991; - -function checkUInt53(n) { - if (n < 0 || n > MAX_SAFE_INTEGER || n % 1 !== 0) throw new RangeError('value out of range'); -} - -function encode(_number, buffer, offset) { - checkUInt53(_number); - if (!buffer) buffer = Buffer.allocUnsafe(encodingLength(_number)); - if (!Buffer.isBuffer(buffer)) throw new TypeError('buffer must be a Buffer instance'); - if (!offset) offset = 0; // 8 bit - - if (_number < 0xfd) { - buffer.writeUInt8(_number, offset); - Object.assign(encode, { - bytes: 1 - }); // 16 bit - } else if (_number <= 0xffff) { - buffer.writeUInt8(0xfd, offset); - buffer.writeUInt16LE(_number, offset + 1); - Object.assign(encode, { - bytes: 3 - }); // 32 bit - } else if (_number <= 0xffffffff) { - buffer.writeUInt8(0xfe, offset); - buffer.writeUInt32LE(_number, offset + 1); - Object.assign(encode, { - bytes: 5 - }); // 64 bit - } else { - buffer.writeUInt8(0xff, offset); - buffer.writeUInt32LE(_number >>> 0, offset + 1); - buffer.writeUInt32LE(_number / 0x100000000 | 0, offset + 5); - Object.assign(encode, { - bytes: 9 - }); - } - - return buffer; -} - -exports.encode = encode; - -function decode(buffer, offset) { - if (!Buffer.isBuffer(buffer)) throw new TypeError('buffer must be a Buffer instance'); - if (!offset) offset = 0; - var first = buffer.readUInt8(offset); // 8 bit - - if (first < 0xfd) { - Object.assign(decode, { - bytes: 1 - }); - return first; // 16 bit - } else if (first === 0xfd) { - Object.assign(decode, { - bytes: 3 - }); - return buffer.readUInt16LE(offset + 1); // 32 bit - } else if (first === 0xfe) { - Object.assign(decode, { - bytes: 5 - }); - return buffer.readUInt32LE(offset + 1); // 64 bit - } else { - Object.assign(decode, { - bytes: 9 - }); - var lo = buffer.readUInt32LE(offset + 1); - var hi = buffer.readUInt32LE(offset + 5); - - var _number = hi * 0x0100000000 + lo; - - checkUInt53(_number); - return _number; - } -} - -exports.decode = decode; - -function encodingLength(_number) { - checkUInt53(_number); - return _number < 0xfd ? 1 : _number <= 0xffff ? 3 : _number <= 0xffffffff ? 5 : 9; -} - -exports.encodingLength = encodingLength; -},{"buffer":"dskh"}],"cEUk":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } - -function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } - -function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } - -function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var varuint = require('./varint'); - -exports.range = function (n) { - return _toConsumableArray(Array(n).keys()); -}; - -function reverseBuffer(buffer) { - if (buffer.length < 1) return buffer; - var j = buffer.length - 1; - var tmp = 0; - - for (var i = 0; i < buffer.length / 2; i++) { - tmp = buffer[i]; - buffer[i] = buffer[j]; - buffer[j] = tmp; - j--; - } - - return buffer; -} - -exports.reverseBuffer = reverseBuffer; - -function keyValsToBuffer(keyVals) { - var buffers = keyVals.map(keyValToBuffer); - buffers.push(Buffer.from([0])); - return Buffer.concat(buffers); -} - -exports.keyValsToBuffer = keyValsToBuffer; - -function keyValToBuffer(keyVal) { - var keyLen = keyVal.key.length; - var valLen = keyVal.value.length; - var keyVarIntLen = varuint.encodingLength(keyLen); - var valVarIntLen = varuint.encodingLength(valLen); - var buffer = Buffer.allocUnsafe(keyVarIntLen + keyLen + valVarIntLen + valLen); - varuint.encode(keyLen, buffer, 0); - keyVal.key.copy(buffer, keyVarIntLen); - varuint.encode(valLen, buffer, keyVarIntLen + keyLen); - keyVal.value.copy(buffer, keyVarIntLen + keyLen + valVarIntLen); - return buffer; -} - -exports.keyValToBuffer = keyValToBuffer; // https://github.com/feross/buffer/blob/master/index.js#L1127 - -function verifuint(value, max) { - if (typeof value !== 'number') throw new Error('cannot write a non-number as a number'); - if (value < 0) throw new Error('specified a negative value for writing an unsigned value'); - if (value > max) throw new Error('RangeError: value out of range'); - if (Math.floor(value) !== value) throw new Error('value has a fractional component'); -} - -function readUInt64LE(buffer, offset) { - var a = buffer.readUInt32LE(offset); - var b = buffer.readUInt32LE(offset + 4); - b *= 0x100000000; - verifuint(b + a, 0x001fffffffffffff); - return b + a; -} - -exports.readUInt64LE = readUInt64LE; - -function writeUInt64LE(buffer, value, offset) { - verifuint(value, 0x001fffffffffffff); - buffer.writeInt32LE(value & -1, offset); - buffer.writeUInt32LE(Math.floor(value / 0x100000000), offset + 4); - return offset + 8; -} - -exports.writeUInt64LE = writeUInt64LE; -},{"./varint":"ViXA","buffer":"dskh"}],"lZIU":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var typeFields_1 = require('../../typeFields'); - -var tools_1 = require('../tools'); - -var varuint = require('../varint'); - -function decode(keyVal) { - if (keyVal.key[0] !== typeFields_1.InputTypes.WITNESS_UTXO) { - throw new Error('Decode Error: could not decode witnessUtxo with key 0x' + keyVal.key.toString('hex')); - } - - var value = tools_1.readUInt64LE(keyVal.value, 0); - var _offset = 8; - var scriptLen = varuint.decode(keyVal.value, _offset); - _offset += varuint.encodingLength(scriptLen); - var script = keyVal.value.slice(_offset); - - if (script.length !== scriptLen) { - throw new Error('Decode Error: WITNESS_UTXO script is not proper length'); - } - - return { - script: script, - value: value - }; -} - -exports.decode = decode; - -function encode(data) { - var script = data.script, - value = data.value; - var varintLen = varuint.encodingLength(script.length); - var result = Buffer.allocUnsafe(8 + varintLen + script.length); - tools_1.writeUInt64LE(result, value, 0); - varuint.encode(script.length, result, 8); - script.copy(result, 8 + varintLen); - return { - key: Buffer.from([typeFields_1.InputTypes.WITNESS_UTXO]), - value: result - }; -} - -exports.encode = encode; -exports.expected = '{ script: Buffer; value: number; }'; - -function check(data) { - return Buffer.isBuffer(data.script) && typeof data.value === 'number'; -} - -exports.check = check; - -function canAdd(currentData, newData) { - return !!currentData && !!newData && currentData.witnessUtxo === undefined && currentData.nonWitnessUtxo === undefined; -} - -exports.canAdd = canAdd; -},{"../../typeFields":"TcPe","../tools":"cEUk","../varint":"ViXA","buffer":"dskh"}],"i1UC":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } - -function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } - -function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } - -function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var range = function range(n) { - return _toConsumableArray(Array(n).keys()); -}; - -function makeConverter(TYPE_BYTE) { - function decode(keyVal) { - if (keyVal.key[0] !== TYPE_BYTE) { - throw new Error('Decode Error: could not decode bip32Derivation with key 0x' + keyVal.key.toString('hex')); - } - - if (!(keyVal.key.length === 34 || keyVal.key.length === 66) || ![2, 3, 4].includes(keyVal.key[1])) { - throw new Error('Decode Error: bip32Derivation has invalid pubkey in key 0x' + keyVal.key.toString('hex')); - } - - if (keyVal.value.length / 4 % 1 !== 0) { - throw new Error('Decode Error: Input BIP32_DERIVATION value length should be multiple of 4'); - } - - var pubkey = keyVal.key.slice(1); - var data = { - masterFingerprint: keyVal.value.slice(0, 4), - pubkey: pubkey, - path: 'm' - }; - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = range(keyVal.value.length / 4 - 1)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var i = _step.value; - var val = keyVal.value.readUInt32LE(i * 4 + 4); - var isHard = !!(val & 0x80000000); - var idx = val & 0x7fffffff; - data.path += '/' + idx.toString(10) + (isHard ? "'" : ''); - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return != null) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } - - return data; - } - - function encode(data) { - var head = Buffer.from([TYPE_BYTE]); - var key = Buffer.concat([head, data.pubkey]); - var splitPath = data.path.split('/'); - var value = Buffer.allocUnsafe(splitPath.length * 4); - data.masterFingerprint.copy(value, 0); - var offset = 4; - splitPath.slice(1).forEach(function (level) { - var isHard = level.slice(-1) === "'"; - var num = 0x7fffffff & parseInt(isHard ? level.slice(0, -1) : level, 10); - if (isHard) num += 0x80000000; - value.writeUInt32LE(num, offset); - offset += 4; - }); - return { - key: key, - value: value - }; - } - - var expected = '{ masterFingerprint: Buffer; pubkey: Buffer; path: string; }'; - - function check(data) { - return Buffer.isBuffer(data.pubkey) && Buffer.isBuffer(data.masterFingerprint) && typeof data.path === 'string' && [33, 65].includes(data.pubkey.length) && [2, 3, 4].includes(data.pubkey[0]) && data.masterFingerprint.length === 4; - } - - function canAddToArray(array, item, dupeSet) { - var dupeString = item.pubkey.toString('hex'); - if (dupeSet.has(dupeString)) return false; - dupeSet.add(dupeString); - return array.filter(function (v) { - return v.pubkey.equals(item.pubkey); - }).length === 0; - } - - return { - decode: decode, - encode: encode, - check: check, - expected: expected, - canAddToArray: canAddToArray - }; -} - -exports.makeConverter = makeConverter; -},{"buffer":"dskh"}],"qJSm":[function(require,module,exports) { -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -function makeChecker(pubkeyTypes) { - return checkPubkey; - - function checkPubkey(keyVal) { - var pubkey; - - if (pubkeyTypes.includes(keyVal.key[0])) { - pubkey = keyVal.key.slice(1); - - if (!(pubkey.length === 33 || pubkey.length === 65) || ![2, 3, 4].includes(pubkey[0])) { - throw new Error('Format Error: invalid pubkey in key 0x' + keyVal.key.toString('hex')); - } - } - - return pubkey; - } -} - -exports.makeChecker = makeChecker; -},{}],"tAlt":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -function makeConverter(TYPE_BYTE) { - function decode(keyVal) { - if (keyVal.key[0] !== TYPE_BYTE) { - throw new Error('Decode Error: could not decode redeemScript with key 0x' + keyVal.key.toString('hex')); - } - - return keyVal.value; - } - - function encode(data) { - var key = Buffer.from([TYPE_BYTE]); - return { - key: key, - value: data - }; - } - - var expected = 'Buffer'; - - function check(data) { - return Buffer.isBuffer(data); - } - - function canAdd(currentData, newData) { - return !!currentData && !!newData && currentData.redeemScript === undefined; - } - - return { - decode: decode, - encode: encode, - check: check, - expected: expected, - canAdd: canAdd - }; -} - -exports.makeConverter = makeConverter; -},{"buffer":"dskh"}],"KvC2":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -function makeConverter(TYPE_BYTE) { - function decode(keyVal) { - if (keyVal.key[0] !== TYPE_BYTE) { - throw new Error('Decode Error: could not decode witnessScript with key 0x' + keyVal.key.toString('hex')); - } - - return keyVal.value; - } - - function encode(data) { - var key = Buffer.from([TYPE_BYTE]); - return { - key: key, - value: data - }; - } - - var expected = 'Buffer'; - - function check(data) { - return Buffer.isBuffer(data); - } - - function canAdd(currentData, newData) { - return !!currentData && !!newData && currentData.witnessScript === undefined; - } - - return { - decode: decode, - encode: encode, - check: check, - expected: expected, - canAdd: canAdd - }; -} - -exports.makeConverter = makeConverter; -},{"buffer":"dskh"}],"E3XB":[function(require,module,exports) { -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var typeFields_1 = require('../typeFields'); - -var globalXpub = require('./global/globalXpub'); - -var unsignedTx = require('./global/unsignedTx'); - -var finalScriptSig = require('./input/finalScriptSig'); - -var finalScriptWitness = require('./input/finalScriptWitness'); - -var nonWitnessUtxo = require('./input/nonWitnessUtxo'); - -var partialSig = require('./input/partialSig'); - -var porCommitment = require('./input/porCommitment'); - -var sighashType = require('./input/sighashType'); - -var witnessUtxo = require('./input/witnessUtxo'); - -var bip32Derivation = require('./shared/bip32Derivation'); - -var checkPubkey = require('./shared/checkPubkey'); - -var redeemScript = require('./shared/redeemScript'); - -var witnessScript = require('./shared/witnessScript'); - -var globals = { - unsignedTx: unsignedTx, - globalXpub: globalXpub, - // pass an Array of key bytes that require pubkey beside the key - checkPubkey: checkPubkey.makeChecker([]) -}; -exports.globals = globals; -var inputs = { - nonWitnessUtxo: nonWitnessUtxo, - partialSig: partialSig, - sighashType: sighashType, - finalScriptSig: finalScriptSig, - finalScriptWitness: finalScriptWitness, - porCommitment: porCommitment, - witnessUtxo: witnessUtxo, - bip32Derivation: bip32Derivation.makeConverter(typeFields_1.InputTypes.BIP32_DERIVATION), - redeemScript: redeemScript.makeConverter(typeFields_1.InputTypes.REDEEM_SCRIPT), - witnessScript: witnessScript.makeConverter(typeFields_1.InputTypes.WITNESS_SCRIPT), - checkPubkey: checkPubkey.makeChecker([typeFields_1.InputTypes.PARTIAL_SIG, typeFields_1.InputTypes.BIP32_DERIVATION]) -}; -exports.inputs = inputs; -var outputs = { - bip32Derivation: bip32Derivation.makeConverter(typeFields_1.OutputTypes.BIP32_DERIVATION), - redeemScript: redeemScript.makeConverter(typeFields_1.OutputTypes.REDEEM_SCRIPT), - witnessScript: witnessScript.makeConverter(typeFields_1.OutputTypes.WITNESS_SCRIPT), - checkPubkey: checkPubkey.makeChecker([typeFields_1.OutputTypes.BIP32_DERIVATION]) -}; -exports.outputs = outputs; -},{"../typeFields":"TcPe","./global/globalXpub":"vGPv","./global/unsignedTx":"KAzb","./input/finalScriptSig":"ktbP","./input/finalScriptWitness":"rKOF","./input/nonWitnessUtxo":"suxJ","./input/partialSig":"DQOH","./input/porCommitment":"N7P5","./input/sighashType":"b4tW","./input/witnessUtxo":"lZIU","./shared/bip32Derivation":"i1UC","./shared/checkPubkey":"qJSm","./shared/redeemScript":"tAlt","./shared/witnessScript":"KvC2"}],"ykP0":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var convert = require('../converter'); - -var tools_1 = require('../converter/tools'); - -var varuint = require('../converter/varint'); - -var typeFields_1 = require('../typeFields'); - -function psbtFromBuffer(buffer, txGetter) { - var offset = 0; - - function varSlice() { - var keyLen = varuint.decode(buffer, offset); - offset += varuint.encodingLength(keyLen); - var key = buffer.slice(offset, offset + keyLen); - offset += keyLen; - return key; - } - - function readUInt32BE() { - var num = buffer.readUInt32BE(offset); - offset += 4; - return num; - } - - function readUInt8() { - var num = buffer.readUInt8(offset); - offset += 1; - return num; - } - - function getKeyValue() { - var key = varSlice(); - var value = varSlice(); - return { - key: key, - value: value - }; - } - - function checkEndOfKeyValPairs() { - if (offset >= buffer.length) { - throw new Error('Format Error: Unexpected End of PSBT'); - } - - var isEnd = buffer.readUInt8(offset) === 0; - - if (isEnd) { - offset++; - } - - return isEnd; - } - - if (readUInt32BE() !== 0x70736274) { - throw new Error('Format Error: Invalid Magic Number'); - } - - if (readUInt8() !== 0xff) { - throw new Error('Format Error: Magic Number must be followed by 0xff separator'); - } - - var globalMapKeyVals = []; - var globalKeyIndex = {}; - - while (!checkEndOfKeyValPairs()) { - var keyVal = getKeyValue(); - var hexKey = keyVal.key.toString('hex'); - - if (globalKeyIndex[hexKey]) { - throw new Error('Format Error: Keys must be unique for global keymap: key ' + hexKey); - } - - globalKeyIndex[hexKey] = 1; - globalMapKeyVals.push(keyVal); - } - - var unsignedTxMaps = globalMapKeyVals.filter(function (keyVal) { - return keyVal.key[0] === typeFields_1.GlobalTypes.UNSIGNED_TX; - }); - - if (unsignedTxMaps.length !== 1) { - throw new Error('Format Error: Only one UNSIGNED_TX allowed'); - } - - var unsignedTx = txGetter(unsignedTxMaps[0].value); // Get input and output counts to loop the respective fields - - var _unsignedTx$getInputO = unsignedTx.getInputOutputCounts(), - inputCount = _unsignedTx$getInputO.inputCount, - outputCount = _unsignedTx$getInputO.outputCount; - - var inputKeyVals = []; - var outputKeyVals = []; // Get input fields - - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = tools_1.range(inputCount)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var index = _step.value; - var inputKeyIndex = {}; - var input = []; - - while (!checkEndOfKeyValPairs()) { - var _keyVal = getKeyValue(); - - var _hexKey = _keyVal.key.toString('hex'); - - if (inputKeyIndex[_hexKey]) { - throw new Error('Format Error: Keys must be unique for each input: ' + 'input index ' + index + ' key ' + _hexKey); - } - - inputKeyIndex[_hexKey] = 1; - input.push(_keyVal); - } - - inputKeyVals.push(input); - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return != null) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } - - var _iteratorNormalCompletion2 = true; - var _didIteratorError2 = false; - var _iteratorError2 = undefined; - - try { - for (var _iterator2 = tools_1.range(outputCount)[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { - var _index = _step2.value; - var outputKeyIndex = {}; - var output = []; - - while (!checkEndOfKeyValPairs()) { - var _keyVal2 = getKeyValue(); - - var _hexKey2 = _keyVal2.key.toString('hex'); - - if (outputKeyIndex[_hexKey2]) { - throw new Error('Format Error: Keys must be unique for each output: ' + 'output index ' + _index + ' key ' + _hexKey2); - } - - outputKeyIndex[_hexKey2] = 1; - output.push(_keyVal2); - } - - outputKeyVals.push(output); - } - } catch (err) { - _didIteratorError2 = true; - _iteratorError2 = err; - } finally { - try { - if (!_iteratorNormalCompletion2 && _iterator2.return != null) { - _iterator2.return(); - } - } finally { - if (_didIteratorError2) { - throw _iteratorError2; - } - } - } - - return psbtFromKeyVals(unsignedTx, { - globalMapKeyVals: globalMapKeyVals, - inputKeyVals: inputKeyVals, - outputKeyVals: outputKeyVals - }); -} - -exports.psbtFromBuffer = psbtFromBuffer; - -function checkKeyBuffer(type, keyBuf, keyNum) { - if (!keyBuf.equals(Buffer.from([keyNum]))) { - throw new Error("Format Error: Invalid ".concat(type, " key: ").concat(keyBuf.toString('hex'))); - } -} - -exports.checkKeyBuffer = checkKeyBuffer; - -function psbtFromKeyVals(unsignedTx, _ref) { - var globalMapKeyVals = _ref.globalMapKeyVals, - inputKeyVals = _ref.inputKeyVals, - outputKeyVals = _ref.outputKeyVals; - // That was easy :-) - var globalMap = { - unsignedTx: unsignedTx - }; - var txCount = 0; - var _iteratorNormalCompletion3 = true; - var _didIteratorError3 = false; - var _iteratorError3 = undefined; - - try { - for (var _iterator3 = globalMapKeyVals[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { - var keyVal = _step3.value; - - // If a globalMap item needs pubkey, uncomment - // const pubkey = convert.globals.checkPubkey(keyVal); - switch (keyVal.key[0]) { - case typeFields_1.GlobalTypes.UNSIGNED_TX: - checkKeyBuffer('global', keyVal.key, typeFields_1.GlobalTypes.UNSIGNED_TX); - - if (txCount > 0) { - throw new Error('Format Error: GlobalMap has multiple UNSIGNED_TX'); - } - - txCount++; - break; - - case typeFields_1.GlobalTypes.GLOBAL_XPUB: - if (globalMap.globalXpub === undefined) { - globalMap.globalXpub = []; - } - - globalMap.globalXpub.push(convert.globals.globalXpub.decode(keyVal)); - break; - - default: - // This will allow inclusion during serialization. - if (!globalMap.unknownKeyVals) globalMap.unknownKeyVals = []; - globalMap.unknownKeyVals.push(keyVal); - } - } // Get input and output counts to loop the respective fields - - } catch (err) { - _didIteratorError3 = true; - _iteratorError3 = err; - } finally { - try { - if (!_iteratorNormalCompletion3 && _iterator3.return != null) { - _iterator3.return(); - } - } finally { - if (_didIteratorError3) { - throw _iteratorError3; - } - } - } - - var inputCount = inputKeyVals.length; - var outputCount = outputKeyVals.length; - var inputs = []; - var outputs = []; // Get input fields - - var _iteratorNormalCompletion4 = true; - var _didIteratorError4 = false; - var _iteratorError4 = undefined; - - try { - for (var _iterator4 = tools_1.range(inputCount)[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { - var index = _step4.value; - var input = {}; - var _iteratorNormalCompletion6 = true; - var _didIteratorError6 = false; - var _iteratorError6 = undefined; - - try { - for (var _iterator6 = inputKeyVals[index][Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { - var _keyVal3 = _step6.value; - convert.inputs.checkPubkey(_keyVal3); - - switch (_keyVal3.key[0]) { - case typeFields_1.InputTypes.NON_WITNESS_UTXO: - checkKeyBuffer('input', _keyVal3.key, typeFields_1.InputTypes.NON_WITNESS_UTXO); - - if (input.nonWitnessUtxo !== undefined || input.witnessUtxo !== undefined) { - throw new Error('Format Error: Input has multiple [NON_]WITNESS_UTXO'); - } - - input.nonWitnessUtxo = convert.inputs.nonWitnessUtxo.decode(_keyVal3); - break; - - case typeFields_1.InputTypes.WITNESS_UTXO: - checkKeyBuffer('input', _keyVal3.key, typeFields_1.InputTypes.WITNESS_UTXO); - - if (input.nonWitnessUtxo !== undefined || input.witnessUtxo !== undefined) { - throw new Error('Format Error: Input has multiple [NON_]WITNESS_UTXO'); - } - - input.witnessUtxo = convert.inputs.witnessUtxo.decode(_keyVal3); - break; - - case typeFields_1.InputTypes.PARTIAL_SIG: - if (input.partialSig === undefined) { - input.partialSig = []; - } - - input.partialSig.push(convert.inputs.partialSig.decode(_keyVal3)); - break; - - case typeFields_1.InputTypes.SIGHASH_TYPE: - checkKeyBuffer('input', _keyVal3.key, typeFields_1.InputTypes.SIGHASH_TYPE); - - if (input.sighashType !== undefined) { - throw new Error('Format Error: Input has multiple SIGHASH_TYPE'); - } - - input.sighashType = convert.inputs.sighashType.decode(_keyVal3); - break; - - case typeFields_1.InputTypes.REDEEM_SCRIPT: - checkKeyBuffer('input', _keyVal3.key, typeFields_1.InputTypes.REDEEM_SCRIPT); - - if (input.redeemScript !== undefined) { - throw new Error('Format Error: Input has multiple REDEEM_SCRIPT'); - } - - input.redeemScript = convert.inputs.redeemScript.decode(_keyVal3); - break; - - case typeFields_1.InputTypes.WITNESS_SCRIPT: - checkKeyBuffer('input', _keyVal3.key, typeFields_1.InputTypes.WITNESS_SCRIPT); - - if (input.witnessScript !== undefined) { - throw new Error('Format Error: Input has multiple WITNESS_SCRIPT'); - } - - input.witnessScript = convert.inputs.witnessScript.decode(_keyVal3); - break; - - case typeFields_1.InputTypes.BIP32_DERIVATION: - if (input.bip32Derivation === undefined) { - input.bip32Derivation = []; - } - - input.bip32Derivation.push(convert.inputs.bip32Derivation.decode(_keyVal3)); - break; - - case typeFields_1.InputTypes.FINAL_SCRIPTSIG: - checkKeyBuffer('input', _keyVal3.key, typeFields_1.InputTypes.FINAL_SCRIPTSIG); - input.finalScriptSig = convert.inputs.finalScriptSig.decode(_keyVal3); - break; - - case typeFields_1.InputTypes.FINAL_SCRIPTWITNESS: - checkKeyBuffer('input', _keyVal3.key, typeFields_1.InputTypes.FINAL_SCRIPTWITNESS); - input.finalScriptWitness = convert.inputs.finalScriptWitness.decode(_keyVal3); - break; - - case typeFields_1.InputTypes.POR_COMMITMENT: - checkKeyBuffer('input', _keyVal3.key, typeFields_1.InputTypes.POR_COMMITMENT); - input.porCommitment = convert.inputs.porCommitment.decode(_keyVal3); - break; - - default: - // This will allow inclusion during serialization. - if (!input.unknownKeyVals) input.unknownKeyVals = []; - input.unknownKeyVals.push(_keyVal3); - } - } - } catch (err) { - _didIteratorError6 = true; - _iteratorError6 = err; - } finally { - try { - if (!_iteratorNormalCompletion6 && _iterator6.return != null) { - _iterator6.return(); - } - } finally { - if (_didIteratorError6) { - throw _iteratorError6; - } - } - } - - inputs.push(input); - } - } catch (err) { - _didIteratorError4 = true; - _iteratorError4 = err; - } finally { - try { - if (!_iteratorNormalCompletion4 && _iterator4.return != null) { - _iterator4.return(); - } - } finally { - if (_didIteratorError4) { - throw _iteratorError4; - } - } - } - - var _iteratorNormalCompletion5 = true; - var _didIteratorError5 = false; - var _iteratorError5 = undefined; - - try { - for (var _iterator5 = tools_1.range(outputCount)[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { - var _index2 = _step5.value; - var output = {}; - var _iteratorNormalCompletion7 = true; - var _didIteratorError7 = false; - var _iteratorError7 = undefined; - - try { - for (var _iterator7 = outputKeyVals[_index2][Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) { - var _keyVal4 = _step7.value; - convert.outputs.checkPubkey(_keyVal4); - - switch (_keyVal4.key[0]) { - case typeFields_1.OutputTypes.REDEEM_SCRIPT: - checkKeyBuffer('output', _keyVal4.key, typeFields_1.OutputTypes.REDEEM_SCRIPT); - - if (output.redeemScript !== undefined) { - throw new Error('Format Error: Output has multiple REDEEM_SCRIPT'); - } - - output.redeemScript = convert.outputs.redeemScript.decode(_keyVal4); - break; - - case typeFields_1.OutputTypes.WITNESS_SCRIPT: - checkKeyBuffer('output', _keyVal4.key, typeFields_1.OutputTypes.WITNESS_SCRIPT); - - if (output.witnessScript !== undefined) { - throw new Error('Format Error: Output has multiple WITNESS_SCRIPT'); - } - - output.witnessScript = convert.outputs.witnessScript.decode(_keyVal4); - break; - - case typeFields_1.OutputTypes.BIP32_DERIVATION: - if (output.bip32Derivation === undefined) { - output.bip32Derivation = []; - } - - output.bip32Derivation.push(convert.outputs.bip32Derivation.decode(_keyVal4)); - break; - - default: - if (!output.unknownKeyVals) output.unknownKeyVals = []; - output.unknownKeyVals.push(_keyVal4); - } - } - } catch (err) { - _didIteratorError7 = true; - _iteratorError7 = err; - } finally { - try { - if (!_iteratorNormalCompletion7 && _iterator7.return != null) { - _iterator7.return(); - } - } finally { - if (_didIteratorError7) { - throw _iteratorError7; - } - } - } - - outputs.push(output); - } - } catch (err) { - _didIteratorError5 = true; - _iteratorError5 = err; - } finally { - try { - if (!_iteratorNormalCompletion5 && _iterator5.return != null) { - _iterator5.return(); - } - } finally { - if (_didIteratorError5) { - throw _iteratorError5; - } - } - } - - return { - globalMap: globalMap, - inputs: inputs, - outputs: outputs - }; -} - -exports.psbtFromKeyVals = psbtFromKeyVals; -},{"../converter":"E3XB","../converter/tools":"cEUk","../converter/varint":"ViXA","../typeFields":"TcPe","buffer":"dskh"}],"l8QV":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } - -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } - -function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var convert = require('../converter'); - -var tools_1 = require('../converter/tools'); - -function psbtToBuffer(_ref) { - var globalMap = _ref.globalMap, - inputs = _ref.inputs, - outputs = _ref.outputs; - - var _psbtToKeyVals = psbtToKeyVals({ - globalMap: globalMap, - inputs: inputs, - outputs: outputs - }), - globalKeyVals = _psbtToKeyVals.globalKeyVals, - inputKeyVals = _psbtToKeyVals.inputKeyVals, - outputKeyVals = _psbtToKeyVals.outputKeyVals; - - var globalBuffer = tools_1.keyValsToBuffer(globalKeyVals); - - var keyValsOrEmptyToBuffer = function keyValsOrEmptyToBuffer(keyVals) { - return keyVals.length === 0 ? [Buffer.from([0])] : keyVals.map(tools_1.keyValsToBuffer); - }; - - var inputBuffers = keyValsOrEmptyToBuffer(inputKeyVals); - var outputBuffers = keyValsOrEmptyToBuffer(outputKeyVals); - var header = Buffer.allocUnsafe(5); - header.writeUIntBE(0x70736274ff, 0, 5); - return Buffer.concat([header, globalBuffer].concat(inputBuffers, outputBuffers)); -} - -exports.psbtToBuffer = psbtToBuffer; - -var sortKeyVals = function sortKeyVals(a, b) { - return a.key.compare(b.key); -}; - -function keyValsFromMap(keyValMap, converterFactory) { - var keyHexSet = new Set(); - var keyVals = Object.entries(keyValMap).reduce(function (result, _ref2) { - var _ref3 = _slicedToArray(_ref2, 2), - key = _ref3[0], - value = _ref3[1]; - - if (key === 'unknownKeyVals') return result; // We are checking for undefined anyways. So ignore TS error - // @ts-ignore - - var converter = converterFactory[key]; - if (converter === undefined) return result; - var encodedKeyVals = (Array.isArray(value) ? value : [value]).map(converter.encode); - var keyHexes = encodedKeyVals.map(function (kv) { - return kv.key.toString('hex'); - }); - keyHexes.forEach(function (hex) { - if (keyHexSet.has(hex)) throw new Error('Serialize Error: Duplicate key: ' + hex); - keyHexSet.add(hex); - }); - return result.concat(encodedKeyVals); - }, []); // Get other keyVals that have not yet been gotten - - var otherKeyVals = keyValMap.unknownKeyVals ? keyValMap.unknownKeyVals.filter(function (keyVal) { - return !keyHexSet.has(keyVal.key.toString('hex')); - }) : []; - return keyVals.concat(otherKeyVals).sort(sortKeyVals); -} - -function psbtToKeyVals(_ref4) { - var globalMap = _ref4.globalMap, - inputs = _ref4.inputs, - outputs = _ref4.outputs; - // First parse the global keyVals - // Get any extra keyvals to pass along - return { - globalKeyVals: keyValsFromMap(globalMap, convert.globals), - inputKeyVals: inputs.map(function (i) { - return keyValsFromMap(i, convert.inputs); - }), - outputKeyVals: outputs.map(function (o) { - return keyValsFromMap(o, convert.outputs); - }) - }; -} - -exports.psbtToKeyVals = psbtToKeyVals; -},{"../converter":"E3XB","../converter/tools":"cEUk","buffer":"dskh"}],"jTIM":[function(require,module,exports) { -'use strict'; - -function __export(m) { - for (var p in m) { - if (!exports.hasOwnProperty(p)) exports[p] = m[p]; - } -} - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -__export(require('./fromBuffer')); - -__export(require('./toBuffer')); -},{"./fromBuffer":"ykP0","./toBuffer":"l8QV"}],"qsU6":[function(require,module,exports) { -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var parser_1 = require('../parser'); - -function combine(psbts) { - var self = psbts[0]; - var selfKeyVals = parser_1.psbtToKeyVals(self); - var others = psbts.slice(1); - if (others.length === 0) throw new Error('Combine: Nothing to combine'); - var selfTx = getTx(self); - - if (selfTx === undefined) { - throw new Error('Combine: Self missing transaction'); - } - - var selfGlobalSet = getKeySet(selfKeyVals.globalKeyVals); - var selfInputSets = selfKeyVals.inputKeyVals.map(getKeySet); - var selfOutputSets = selfKeyVals.outputKeyVals.map(getKeySet); - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - var _loop = function _loop() { - var other = _step.value; - var otherTx = getTx(other); - - if (otherTx === undefined || !otherTx.toBuffer().equals(selfTx.toBuffer())) { - throw new Error('Combine: One of the Psbts does not have the same transaction.'); - } - - var otherKeyVals = parser_1.psbtToKeyVals(other); - var otherGlobalSet = getKeySet(otherKeyVals.globalKeyVals); - otherGlobalSet.forEach(keyPusher(selfGlobalSet, selfKeyVals.globalKeyVals, otherKeyVals.globalKeyVals)); - var otherInputSets = otherKeyVals.inputKeyVals.map(getKeySet); - otherInputSets.forEach(function (inputSet, idx) { - return inputSet.forEach(keyPusher(selfInputSets[idx], selfKeyVals.inputKeyVals[idx], otherKeyVals.inputKeyVals[idx])); - }); - var otherOutputSets = otherKeyVals.outputKeyVals.map(getKeySet); - otherOutputSets.forEach(function (outputSet, idx) { - return outputSet.forEach(keyPusher(selfOutputSets[idx], selfKeyVals.outputKeyVals[idx], otherKeyVals.outputKeyVals[idx])); - }); - }; - - for (var _iterator = others[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - _loop(); - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return != null) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } - - return parser_1.psbtFromKeyVals(selfTx, { - globalMapKeyVals: selfKeyVals.globalKeyVals, - inputKeyVals: selfKeyVals.inputKeyVals, - outputKeyVals: selfKeyVals.outputKeyVals - }); -} - -exports.combine = combine; - -function keyPusher(selfSet, selfKeyVals, otherKeyVals) { - return function (key) { - if (selfSet.has(key)) return; - var newKv = otherKeyVals.filter(function (kv) { - return kv.key.toString('hex') === key; - })[0]; - selfKeyVals.push(newKv); - selfSet.add(key); - }; -} - -function getTx(psbt) { - return psbt.globalMap.unsignedTx; -} - -function getKeySet(keyVals) { - var set = new Set(); - keyVals.forEach(function (keyVal) { - var hex = keyVal.key.toString('hex'); - if (set.has(hex)) throw new Error('Combine: KeyValue Map keys should be unique'); - set.add(hex); - }); - return set; -} -},{"../parser":"jTIM"}],"GfFi":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var converter = require('./converter'); - -function checkForInput(inputs, inputIndex) { - var input = inputs[inputIndex]; - if (input === undefined) throw new Error("No input #".concat(inputIndex)); - return input; -} - -exports.checkForInput = checkForInput; - -function checkForOutput(outputs, outputIndex) { - var output = outputs[outputIndex]; - if (output === undefined) throw new Error("No output #".concat(outputIndex)); - return output; -} - -exports.checkForOutput = checkForOutput; - -function checkHasKey(checkKeyVal, keyVals, enumLength) { - if (checkKeyVal.key[0] < enumLength) { - throw new Error("Use the method for your specific key instead of addUnknownKeyVal*"); - } - - if (keyVals && keyVals.filter(function (kv) { - return kv.key.equals(checkKeyVal.key); - }).length !== 0) { - throw new Error("Duplicate Key: ".concat(checkKeyVal.key.toString('hex'))); - } -} - -exports.checkHasKey = checkHasKey; - -function getEnumLength(myenum) { - var count = 0; - Object.keys(myenum).forEach(function (val) { - if (Number(isNaN(Number(val)))) { - count++; - } - }); - return count; -} - -exports.getEnumLength = getEnumLength; - -function inputCheckUncleanFinalized(inputIndex, input) { - var result = false; - - if (!input.nonWitnessUtxo !== !input.witnessUtxo) { - var needScriptSig = !!input.redeemScript; - var needWitnessScript = !!input.witnessScript; - var scriptSigOK = !needScriptSig || !!input.finalScriptSig; - var witnessScriptOK = !needWitnessScript || !!input.finalScriptWitness; - var hasOneFinal = !!input.finalScriptSig || !!input.finalScriptWitness; - result = scriptSigOK && witnessScriptOK && hasOneFinal; - } - - if (result === false) { - throw new Error("Input #".concat(inputIndex, " has too much or too little data to clean")); - } -} - -exports.inputCheckUncleanFinalized = inputCheckUncleanFinalized; - -function throwForUpdateMaker(typeName, name, expected, data) { - throw new Error("Data for ".concat(typeName, " key ").concat(name, " is incorrect: Expected ") + "".concat(expected, " and got ").concat(JSON.stringify(data))); -} - -function updateMaker(typeName) { - return function (updateData, mainData) { - var _loop = function _loop() { - var name = _Object$keys[_i]; - // @ts-ignore - var data = updateData[name]; // @ts-ignore - - var _ref = // @ts-ignore - converter[typeName + 's'][name] || {}, - canAdd = _ref.canAdd, - canAddToArray = _ref.canAddToArray, - check = _ref.check, - expected = _ref.expected; - - var isArray = !!canAddToArray; // If unknown data. ignore and do not add - - if (check) { - if (isArray) { - if (!Array.isArray(data) || // @ts-ignore - mainData[name] && !Array.isArray(mainData[name])) { - throw new Error("Key type ".concat(name, " must be an array")); - } - - if (!data.every(check)) { - throwForUpdateMaker(typeName, name, expected, data); - } // @ts-ignore - - - var arr = mainData[name] || []; - var dupeCheckSet = new Set(); - - if (!data.every(function (v) { - return canAddToArray(arr, v, dupeCheckSet); - })) { - throw new Error('Can not add duplicate data to array'); - } // @ts-ignore - - - mainData[name] = arr.concat(data); - } else { - if (!check(data)) { - throwForUpdateMaker(typeName, name, expected, data); - } - - if (!canAdd(mainData, data)) { - throw new Error("Can not add duplicate data to ".concat(typeName)); - } // @ts-ignore - - - mainData[name] = data; - } - } - }; - - for (var _i = 0, _Object$keys = Object.keys(updateData); _i < _Object$keys.length; _i++) { - _loop(); - } - }; -} - -exports.updateGlobal = updateMaker('global'); -exports.updateInput = updateMaker('input'); -exports.updateOutput = updateMaker('output'); - -function addInputAttributes(inputs, data) { - var index = inputs.length - 1; - var input = checkForInput(inputs, index); - exports.updateInput(data, input); -} - -exports.addInputAttributes = addInputAttributes; - -function addOutputAttributes(outputs, data) { - var index = outputs.length - 1; - var output = checkForInput(outputs, index); - exports.updateOutput(data, output); -} - -exports.addOutputAttributes = addOutputAttributes; - -function defaultVersionSetter(version, txBuf) { - if (!Buffer.isBuffer(txBuf) || txBuf.length < 4) { - throw new Error('Set Version: Invalid Transaction'); - } - - txBuf.writeUInt32LE(version, 0); - return txBuf; -} - -exports.defaultVersionSetter = defaultVersionSetter; - -function defaultLocktimeSetter(locktime, txBuf) { - if (!Buffer.isBuffer(txBuf) || txBuf.length < 4) { - throw new Error('Set Locktime: Invalid Transaction'); - } - - txBuf.writeUInt32LE(locktime, txBuf.length - 4); - return txBuf; -} - -exports.defaultLocktimeSetter = defaultLocktimeSetter; -},{"./converter":"E3XB","buffer":"dskh"}],"Kgzo":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var combiner_1 = require('./combiner'); - -var parser_1 = require('./parser'); - -var typeFields_1 = require('./typeFields'); - -var utils_1 = require('./utils'); - -var Psbt = -/*#__PURE__*/ -function () { - function Psbt(tx) { - _classCallCheck(this, Psbt); - - this.inputs = []; - this.outputs = []; - this.globalMap = { - unsignedTx: tx - }; - } - - _createClass(Psbt, [{ - key: "toBase64", - value: function toBase64() { - var buffer = this.toBuffer(); - return buffer.toString('base64'); - } - }, { - key: "toHex", - value: function toHex() { - var buffer = this.toBuffer(); - return buffer.toString('hex'); - } - }, { - key: "toBuffer", - value: function toBuffer() { - return parser_1.psbtToBuffer(this); - } - }, { - key: "updateGlobal", - value: function updateGlobal(updateData) { - utils_1.updateGlobal(updateData, this.globalMap); - return this; - } - }, { - key: "updateInput", - value: function updateInput(inputIndex, updateData) { - var input = utils_1.checkForInput(this.inputs, inputIndex); - utils_1.updateInput(updateData, input); - return this; - } - }, { - key: "updateOutput", - value: function updateOutput(outputIndex, updateData) { - var output = utils_1.checkForOutput(this.outputs, outputIndex); - utils_1.updateOutput(updateData, output); - return this; - } - }, { - key: "addUnknownKeyValToGlobal", - value: function addUnknownKeyValToGlobal(keyVal) { - utils_1.checkHasKey(keyVal, this.globalMap.unknownKeyVals, utils_1.getEnumLength(typeFields_1.GlobalTypes)); - if (!this.globalMap.unknownKeyVals) this.globalMap.unknownKeyVals = []; - this.globalMap.unknownKeyVals.push(keyVal); - return this; - } - }, { - key: "addUnknownKeyValToInput", - value: function addUnknownKeyValToInput(inputIndex, keyVal) { - var input = utils_1.checkForInput(this.inputs, inputIndex); - utils_1.checkHasKey(keyVal, input.unknownKeyVals, utils_1.getEnumLength(typeFields_1.InputTypes)); - if (!input.unknownKeyVals) input.unknownKeyVals = []; - input.unknownKeyVals.push(keyVal); - return this; - } - }, { - key: "addUnknownKeyValToOutput", - value: function addUnknownKeyValToOutput(outputIndex, keyVal) { - var output = utils_1.checkForOutput(this.outputs, outputIndex); - utils_1.checkHasKey(keyVal, output.unknownKeyVals, utils_1.getEnumLength(typeFields_1.OutputTypes)); - if (!output.unknownKeyVals) output.unknownKeyVals = []; - output.unknownKeyVals.push(keyVal); - return this; - } - }, { - key: "addInput", - value: function addInput(inputData) { - var _this = this; - - this.globalMap.unsignedTx.addInput(inputData); - this.inputs.push({ - unknownKeyVals: [] - }); - var addKeyVals = inputData.unknownKeyVals || []; - var inputIndex = this.inputs.length - 1; - - if (!Array.isArray(addKeyVals)) { - throw new Error('unknownKeyVals must be an Array'); - } - - addKeyVals.forEach(function (keyVal) { - return _this.addUnknownKeyValToInput(inputIndex, keyVal); - }); - utils_1.addInputAttributes(this.inputs, inputData); - return this; - } - }, { - key: "addOutput", - value: function addOutput(outputData) { - var _this2 = this; - - this.globalMap.unsignedTx.addOutput(outputData); - this.outputs.push({ - unknownKeyVals: [] - }); - var addKeyVals = outputData.unknownKeyVals || []; - var outputIndex = this.outputs.length - 1; - - if (!Array.isArray(addKeyVals)) { - throw new Error('unknownKeyVals must be an Array'); - } - - addKeyVals.forEach(function (keyVal) { - return _this2.addUnknownKeyValToInput(outputIndex, keyVal); - }); - utils_1.addOutputAttributes(this.outputs, outputData); - return this; - } - }, { - key: "clearFinalizedInput", - value: function clearFinalizedInput(inputIndex) { - var input = utils_1.checkForInput(this.inputs, inputIndex); - utils_1.inputCheckUncleanFinalized(inputIndex, input); - - for (var _i = 0, _Object$keys = Object.keys(input); _i < _Object$keys.length; _i++) { - var key = _Object$keys[_i]; - - if (!['witnessUtxo', 'nonWitnessUtxo', 'finalScriptSig', 'finalScriptWitness', 'unknownKeyVals'].includes(key)) { - // @ts-ignore - delete input[key]; - } - } - - return this; - } - }, { - key: "combine", - value: function combine() { - for (var _len = arguments.length, those = new Array(_len), _key = 0; _key < _len; _key++) { - those[_key] = arguments[_key]; - } - - // Combine this with those. - // Return self for chaining. - var result = combiner_1.combine([this].concat(those)); - Object.assign(this, result); - return this; - } - }, { - key: "getTransaction", - value: function getTransaction() { - return this.globalMap.unsignedTx.toBuffer(); - } - }], [{ - key: "fromBase64", - value: function fromBase64(data, txFromBuffer) { - var buffer = Buffer.from(data, 'base64'); - return this.fromBuffer(buffer, txFromBuffer); - } - }, { - key: "fromHex", - value: function fromHex(data, txFromBuffer) { - var buffer = Buffer.from(data, 'hex'); - return this.fromBuffer(buffer, txFromBuffer); - } - }, { - key: "fromBuffer", - value: function fromBuffer(buffer, txFromBuffer) { - var results = parser_1.psbtFromBuffer(buffer, txFromBuffer); - var psbt = new this(results.globalMap.unsignedTx); - Object.assign(psbt, results); - return psbt; - } - }]); - - return Psbt; -}(); - -exports.Psbt = Psbt; -},{"./combiner":"qsU6","./parser":"jTIM","./typeFields":"TcPe","./utils":"GfFi","buffer":"dskh"}],"CbJH":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } - -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } - -function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - -function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } - -function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } - -function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } - -function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var bip174_1 = require('bip174'); - -var varuint = require('bip174/src/lib/converter/varint'); - -var utils_1 = require('bip174/src/lib/utils'); - -var address_1 = require('./address'); - -var bufferutils_1 = require('./bufferutils'); - -var crypto_1 = require('./crypto'); - -var ecpair_1 = require('./ecpair'); - -var networks_1 = require('./networks'); - -var payments = require('./payments'); - -var bscript = require('./script'); - -var transaction_1 = require('./transaction'); -/** - * These are the default arguments for a Psbt instance. - */ - - -var DEFAULT_OPTS = { - /** - * A bitcoinjs Network object. This is only used if you pass an `address` - * parameter to addOutput. Otherwise it is not needed and can be left default. - */ - network: networks_1.bitcoin, - - /** - * When extractTransaction is called, the fee rate is checked. - * THIS IS NOT TO BE RELIED ON. - * It is only here as a last ditch effort to prevent sending a 500 BTC fee etc. - */ - maximumFeeRate: 5000 -}; -/** - * Psbt class can parse and generate a PSBT binary based off of the BIP174. - * There are 6 roles that this class fulfills. (Explained in BIP174) - * - * Creator: This can be done with `new Psbt()` - * Updater: This can be done with `psbt.addInput(input)`, `psbt.addInputs(inputs)`, - * `psbt.addOutput(output)`, `psbt.addOutputs(outputs)` when you are looking to - * add new inputs and outputs to the PSBT, and `psbt.updateGlobal(itemObject)`, - * `psbt.updateInput(itemObject)`, `psbt.updateOutput(itemObject)` - * addInput requires hash: Buffer | string; and index: number; as attributes - * and can also include any attributes that are used in updateInput method. - * addOutput requires script: Buffer; and value: number; and likewise can include - * data for updateOutput. - * For a list of what attributes should be what types. Check the bip174 library. - * Also, check the integration tests for some examples of usage. - * Signer: There are a few methods. signAllInputs and signAllInputsAsync, which will search all input - * information for your pubkey or pubkeyhash, and only sign inputs where it finds - * your info. Or you can explicitly sign a specific input with signInput and - * signInputAsync. For the async methods you can create a SignerAsync object - * and use something like a hardware wallet to sign with. (You must implement this) - * Combiner: psbts can be combined easily with `psbt.combine(psbt2, psbt3, psbt4 ...)` - * the psbt calling combine will always have precedence when a conflict occurs. - * Combine checks if the internal bitcoin transaction is the same, so be sure that - * all sequences, version, locktime, etc. are the same before combining. - * Input Finalizer: This role is fairly important. Not only does it need to construct - * the input scriptSigs and witnesses, but it SHOULD verify the signatures etc. - * Before running `psbt.finalizeAllInputs()` please run `psbt.validateSignaturesOfAllInputs()` - * Running any finalize method will delete any data in the input(s) that are no longer - * needed due to the finalized scripts containing the information. - * Transaction Extractor: This role will perform some checks before returning a - * Transaction object. Such as fee rate not being larger than maximumFeeRate etc. - */ - -var Psbt = -/*#__PURE__*/ -function () { - function Psbt() { - var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new bip174_1.Psbt(new PsbtTransaction()); - - _classCallCheck(this, Psbt); - - this.data = data; // set defaults - - this.opts = Object.assign({}, DEFAULT_OPTS, opts); - this.__CACHE = { - __NON_WITNESS_UTXO_TX_CACHE: [], - __NON_WITNESS_UTXO_BUF_CACHE: [], - __TX_IN_CACHE: {}, - __TX: this.data.globalMap.unsignedTx.tx - }; - if (this.data.inputs.length === 0) this.setVersion(2); // Make data hidden when enumerating - - var dpew = function dpew(obj, attr, enumerable, writable) { - return Object.defineProperty(obj, attr, { - enumerable: enumerable, - writable: writable - }); - }; - - dpew(this, '__CACHE', false, true); - dpew(this, 'opts', false, true); - } - - _createClass(Psbt, [{ - key: "combine", - value: function combine() { - var _this$data; - - for (var _len = arguments.length, those = new Array(_len), _key = 0; _key < _len; _key++) { - those[_key] = arguments[_key]; - } - - (_this$data = this.data).combine.apply(_this$data, _toConsumableArray(those.map(function (o) { - return o.data; - }))); - - return this; - } - }, { - key: "clone", - value: function clone() { - // TODO: more efficient cloning - var res = Psbt.fromBuffer(this.data.toBuffer()); - res.opts = JSON.parse(JSON.stringify(this.opts)); - return res; - } - }, { - key: "setMaximumFeeRate", - value: function setMaximumFeeRate(satoshiPerByte) { - check32Bit(satoshiPerByte); // 42.9 BTC per byte IS excessive... so throw - - this.opts.maximumFeeRate = satoshiPerByte; - } - }, { - key: "setVersion", - value: function setVersion(version) { - check32Bit(version); - checkInputsForPartialSig(this.data.inputs, 'setVersion'); - var c = this.__CACHE; - c.__TX.version = version; - c.__EXTRACTED_TX = undefined; - return this; - } - }, { - key: "setLocktime", - value: function setLocktime(locktime) { - check32Bit(locktime); - checkInputsForPartialSig(this.data.inputs, 'setLocktime'); - var c = this.__CACHE; - c.__TX.locktime = locktime; - c.__EXTRACTED_TX = undefined; - return this; - } - }, { - key: "setInputSequence", - value: function setInputSequence(inputIndex, sequence) { - check32Bit(sequence); - checkInputsForPartialSig(this.data.inputs, 'setInputSequence'); - var c = this.__CACHE; - - if (c.__TX.ins.length <= inputIndex) { - throw new Error('Input index too high'); - } - - c.__TX.ins[inputIndex].sequence = sequence; - c.__EXTRACTED_TX = undefined; - return this; - } - }, { - key: "addInputs", - value: function addInputs(inputDatas) { - var _this = this; - - inputDatas.forEach(function (inputData) { - return _this.addInput(inputData); - }); - return this; - } - }, { - key: "addInput", - value: function addInput(inputData) { - checkInputsForPartialSig(this.data.inputs, 'addInput'); - var c = this.__CACHE; - this.data.addInput(inputData); - var txIn = c.__TX.ins[c.__TX.ins.length - 1]; - checkTxInputCache(c, txIn); - var inputIndex = this.data.inputs.length - 1; - var input = this.data.inputs[inputIndex]; - - if (input.nonWitnessUtxo) { - addNonWitnessTxCache(this.__CACHE, input, inputIndex); - } - - c.__FEE = undefined; - c.__FEE_RATE = undefined; - c.__EXTRACTED_TX = undefined; - return this; - } - }, { - key: "addOutputs", - value: function addOutputs(outputDatas) { - var _this2 = this; - - outputDatas.forEach(function (outputData) { - return _this2.addOutput(outputData); - }); - return this; - } - }, { - key: "addOutput", - value: function addOutput(outputData) { - checkInputsForPartialSig(this.data.inputs, 'addOutput'); - var _outputData = outputData, - address = _outputData.address; - - if (typeof address === 'string') { - var network = this.opts.network; - var script = address_1.toOutputScript(address, network); - outputData = Object.assign(outputData, { - script: script - }); - } - - var c = this.__CACHE; - this.data.addOutput(outputData); - c.__FEE = undefined; - c.__FEE_RATE = undefined; - c.__EXTRACTED_TX = undefined; - return this; - } - }, { - key: "extractTransaction", - value: function extractTransaction(disableFeeCheck) { - if (!this.data.inputs.every(isFinalized)) throw new Error('Not finalized'); - var c = this.__CACHE; - - if (!disableFeeCheck) { - checkFees(this, c, this.opts); - } - - if (c.__EXTRACTED_TX) return c.__EXTRACTED_TX; - - var tx = c.__TX.clone(); - - inputFinalizeGetAmts(this.data.inputs, tx, c, true); - return tx; - } - }, { - key: "getFeeRate", - value: function getFeeRate() { - return getTxCacheValue('__FEE_RATE', 'fee rate', this.data.inputs, this.__CACHE); - } - }, { - key: "getFee", - value: function getFee() { - return getTxCacheValue('__FEE', 'fee', this.data.inputs, this.__CACHE); - } - }, { - key: "finalizeAllInputs", - value: function finalizeAllInputs() { - var _this3 = this; - - utils_1.checkForInput(this.data.inputs, 0); // making sure we have at least one - - range(this.data.inputs.length).forEach(function (idx) { - return _this3.finalizeInput(idx); - }); - return this; - } - }, { - key: "finalizeInput", - value: function finalizeInput(inputIndex) { - var input = utils_1.checkForInput(this.data.inputs, inputIndex); - - var _getScriptFromInput = getScriptFromInput(inputIndex, input, this.__CACHE), - script = _getScriptFromInput.script, - isP2SH = _getScriptFromInput.isP2SH, - isP2WSH = _getScriptFromInput.isP2WSH, - isSegwit = _getScriptFromInput.isSegwit; - - if (!script) throw new Error("No script found for input #".concat(inputIndex)); - var scriptType = classifyScript(script); - if (!canFinalize(input, script, scriptType)) throw new Error("Can not finalize input #".concat(inputIndex)); - checkPartialSigSighashes(input); - - var _getFinalScripts = getFinalScripts(script, scriptType, input.partialSig, isSegwit, isP2SH, isP2WSH), - finalScriptSig = _getFinalScripts.finalScriptSig, - finalScriptWitness = _getFinalScripts.finalScriptWitness; - - if (finalScriptSig) this.data.updateInput(inputIndex, { - finalScriptSig: finalScriptSig - }); - if (finalScriptWitness) this.data.updateInput(inputIndex, { - finalScriptWitness: finalScriptWitness - }); - if (!finalScriptSig && !finalScriptWitness) throw new Error("Unknown error finalizing input #".concat(inputIndex)); - this.data.clearFinalizedInput(inputIndex); - return this; - } - }, { - key: "validateSignaturesOfAllInputs", - value: function validateSignaturesOfAllInputs() { - var _this4 = this; - - utils_1.checkForInput(this.data.inputs, 0); // making sure we have at least one - - var results = range(this.data.inputs.length).map(function (idx) { - return _this4.validateSignaturesOfInput(idx); - }); - return results.reduce(function (final, res) { - return res === true && final; - }, true); - } - }, { - key: "validateSignaturesOfInput", - value: function validateSignaturesOfInput(inputIndex, pubkey) { - var input = this.data.inputs[inputIndex]; - var partialSig = (input || {}).partialSig; - if (!input || !partialSig || partialSig.length < 1) throw new Error('No signatures to validate'); - var mySigs = pubkey ? partialSig.filter(function (sig) { - return sig.pubkey.equals(pubkey); - }) : partialSig; - if (mySigs.length < 1) throw new Error('No signatures for this pubkey'); - var results = []; - var hashCache; - var scriptCache; - var sighashCache; - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = mySigs[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var pSig = _step.value; - var sig = bscript.signature.decode(pSig.signature); - - var _ref = sighashCache !== sig.hashType ? getHashForSig(inputIndex, Object.assign({}, input, { - sighashType: sig.hashType - }), this.__CACHE) : { - hash: hashCache, - script: scriptCache - }, - hash = _ref.hash, - script = _ref.script; - - sighashCache = sig.hashType; - hashCache = hash; - scriptCache = script; - checkScriptForPubkey(pSig.pubkey, script, 'verify'); - var keypair = ecpair_1.fromPublicKey(pSig.pubkey); - results.push(keypair.verify(hash, sig.signature)); - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return != null) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } - - return results.every(function (res) { - return res === true; - }); - } - }, { - key: "signAllInputsHD", - value: function signAllInputsHD(hdKeyPair) { - var sighashTypes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [transaction_1.Transaction.SIGHASH_ALL]; - - if (!hdKeyPair || !hdKeyPair.publicKey || !hdKeyPair.fingerprint) { - throw new Error('Need HDSigner to sign input'); - } - - var results = []; - var _iteratorNormalCompletion2 = true; - var _didIteratorError2 = false; - var _iteratorError2 = undefined; - - try { - for (var _iterator2 = range(this.data.inputs.length)[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { - var i = _step2.value; - - try { - this.signInputHD(i, hdKeyPair, sighashTypes); - results.push(true); - } catch (err) { - results.push(false); - } - } - } catch (err) { - _didIteratorError2 = true; - _iteratorError2 = err; - } finally { - try { - if (!_iteratorNormalCompletion2 && _iterator2.return != null) { - _iterator2.return(); - } - } finally { - if (_didIteratorError2) { - throw _iteratorError2; - } - } - } - - if (results.every(function (v) { - return v === false; - })) { - throw new Error('No inputs were signed'); - } - - return this; - } - }, { - key: "signAllInputsHDAsync", - value: function signAllInputsHDAsync(hdKeyPair) { - var _this5 = this; - - var sighashTypes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [transaction_1.Transaction.SIGHASH_ALL]; - return new Promise(function (resolve, reject) { - if (!hdKeyPair || !hdKeyPair.publicKey || !hdKeyPair.fingerprint) { - return reject(new Error('Need HDSigner to sign input')); - } - - var results = []; - var promises = []; - var _iteratorNormalCompletion3 = true; - var _didIteratorError3 = false; - var _iteratorError3 = undefined; - - try { - for (var _iterator3 = range(_this5.data.inputs.length)[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { - var i = _step3.value; - promises.push(_this5.signInputHDAsync(i, hdKeyPair, sighashTypes).then(function () { - results.push(true); - }, function () { - results.push(false); - })); - } - } catch (err) { - _didIteratorError3 = true; - _iteratorError3 = err; - } finally { - try { - if (!_iteratorNormalCompletion3 && _iterator3.return != null) { - _iterator3.return(); - } - } finally { - if (_didIteratorError3) { - throw _iteratorError3; - } - } - } - - return Promise.all(promises).then(function () { - if (results.every(function (v) { - return v === false; - })) { - return reject(new Error('No inputs were signed')); - } - - resolve(); - }); - }); - } - }, { - key: "signInputHD", - value: function signInputHD(inputIndex, hdKeyPair) { - var _this6 = this; - - var sighashTypes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [transaction_1.Transaction.SIGHASH_ALL]; - - if (!hdKeyPair || !hdKeyPair.publicKey || !hdKeyPair.fingerprint) { - throw new Error('Need HDSigner to sign input'); - } - - var signers = getSignersFromHD(inputIndex, this.data.inputs, hdKeyPair); - signers.forEach(function (signer) { - return _this6.signInput(inputIndex, signer, sighashTypes); - }); - return this; - } - }, { - key: "signInputHDAsync", - value: function signInputHDAsync(inputIndex, hdKeyPair) { - var _this7 = this; - - var sighashTypes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [transaction_1.Transaction.SIGHASH_ALL]; - return new Promise(function (resolve, reject) { - if (!hdKeyPair || !hdKeyPair.publicKey || !hdKeyPair.fingerprint) { - return reject(new Error('Need HDSigner to sign input')); - } - - var signers = getSignersFromHD(inputIndex, _this7.data.inputs, hdKeyPair); - var promises = signers.map(function (signer) { - return _this7.signInputAsync(inputIndex, signer, sighashTypes); - }); - return Promise.all(promises).then(function () { - resolve(); - }).catch(reject); - }); - } - }, { - key: "signAllInputs", - value: function signAllInputs(keyPair) { - var sighashTypes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [transaction_1.Transaction.SIGHASH_ALL]; - if (!keyPair || !keyPair.publicKey) throw new Error('Need Signer to sign input'); // TODO: Add a pubkey/pubkeyhash cache to each input - // as input information is added, then eventually - // optimize this method. - - var results = []; - var _iteratorNormalCompletion4 = true; - var _didIteratorError4 = false; - var _iteratorError4 = undefined; - - try { - for (var _iterator4 = range(this.data.inputs.length)[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { - var i = _step4.value; - - try { - this.signInput(i, keyPair, sighashTypes); - results.push(true); - } catch (err) { - results.push(false); - } - } - } catch (err) { - _didIteratorError4 = true; - _iteratorError4 = err; - } finally { - try { - if (!_iteratorNormalCompletion4 && _iterator4.return != null) { - _iterator4.return(); - } - } finally { - if (_didIteratorError4) { - throw _iteratorError4; - } - } - } - - if (results.every(function (v) { - return v === false; - })) { - throw new Error('No inputs were signed'); - } - - return this; - } - }, { - key: "signAllInputsAsync", - value: function signAllInputsAsync(keyPair) { - var _this8 = this; - - var sighashTypes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [transaction_1.Transaction.SIGHASH_ALL]; - return new Promise(function (resolve, reject) { - if (!keyPair || !keyPair.publicKey) return reject(new Error('Need Signer to sign input')); // TODO: Add a pubkey/pubkeyhash cache to each input - // as input information is added, then eventually - // optimize this method. - - var results = []; - var promises = []; - var _iteratorNormalCompletion5 = true; - var _didIteratorError5 = false; - var _iteratorError5 = undefined; - - try { - for (var _iterator5 = _this8.data.inputs.entries()[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { - var _step5$value = _slicedToArray(_step5.value, 1), - i = _step5$value[0]; - - promises.push(_this8.signInputAsync(i, keyPair, sighashTypes).then(function () { - results.push(true); - }, function () { - results.push(false); - })); - } - } catch (err) { - _didIteratorError5 = true; - _iteratorError5 = err; - } finally { - try { - if (!_iteratorNormalCompletion5 && _iterator5.return != null) { - _iterator5.return(); - } - } finally { - if (_didIteratorError5) { - throw _iteratorError5; - } - } - } - - return Promise.all(promises).then(function () { - if (results.every(function (v) { - return v === false; - })) { - return reject(new Error('No inputs were signed')); - } - - resolve(); - }); - }); - } - }, { - key: "signInput", - value: function signInput(inputIndex, keyPair) { - var sighashTypes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [transaction_1.Transaction.SIGHASH_ALL]; - if (!keyPair || !keyPair.publicKey) throw new Error('Need Signer to sign input'); - - var _getHashAndSighashTyp = getHashAndSighashType(this.data.inputs, inputIndex, keyPair.publicKey, this.__CACHE, sighashTypes), - hash = _getHashAndSighashTyp.hash, - sighashType = _getHashAndSighashTyp.sighashType; - - var partialSig = [{ - pubkey: keyPair.publicKey, - signature: bscript.signature.encode(keyPair.sign(hash), sighashType) - }]; - this.data.updateInput(inputIndex, { - partialSig: partialSig - }); - return this; - } - }, { - key: "signInputAsync", - value: function signInputAsync(inputIndex, keyPair) { - var _this9 = this; - - var sighashTypes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [transaction_1.Transaction.SIGHASH_ALL]; - return new Promise(function (resolve, reject) { - if (!keyPair || !keyPair.publicKey) return reject(new Error('Need Signer to sign input')); - - var _getHashAndSighashTyp2 = getHashAndSighashType(_this9.data.inputs, inputIndex, keyPair.publicKey, _this9.__CACHE, sighashTypes), - hash = _getHashAndSighashTyp2.hash, - sighashType = _getHashAndSighashTyp2.sighashType; - - Promise.resolve(keyPair.sign(hash)).then(function (signature) { - var partialSig = [{ - pubkey: keyPair.publicKey, - signature: bscript.signature.encode(signature, sighashType) - }]; - - _this9.data.updateInput(inputIndex, { - partialSig: partialSig - }); - - resolve(); - }); - }); - } - }, { - key: "toBuffer", - value: function toBuffer() { - return this.data.toBuffer(); - } - }, { - key: "toHex", - value: function toHex() { - return this.data.toHex(); - } - }, { - key: "toBase64", - value: function toBase64() { - return this.data.toBase64(); - } - }, { - key: "updateGlobal", - value: function updateGlobal(updateData) { - this.data.updateGlobal(updateData); - return this; - } - }, { - key: "updateInput", - value: function updateInput(inputIndex, updateData) { - this.data.updateInput(inputIndex, updateData); - - if (updateData.nonWitnessUtxo) { - addNonWitnessTxCache(this.__CACHE, this.data.inputs[inputIndex], inputIndex); - } - - return this; - } - }, { - key: "updateOutput", - value: function updateOutput(outputIndex, updateData) { - this.data.updateOutput(outputIndex, updateData); - return this; - } - }, { - key: "addUnknownKeyValToGlobal", - value: function addUnknownKeyValToGlobal(keyVal) { - this.data.addUnknownKeyValToGlobal(keyVal); - return this; - } - }, { - key: "addUnknownKeyValToInput", - value: function addUnknownKeyValToInput(inputIndex, keyVal) { - this.data.addUnknownKeyValToInput(inputIndex, keyVal); - return this; - } - }, { - key: "addUnknownKeyValToOutput", - value: function addUnknownKeyValToOutput(outputIndex, keyVal) { - this.data.addUnknownKeyValToOutput(outputIndex, keyVal); - return this; - } - }, { - key: "clearFinalizedInput", - value: function clearFinalizedInput(inputIndex) { - this.data.clearFinalizedInput(inputIndex); - return this; - } - }, { - key: "inputCount", - get: function get() { - return this.data.inputs.length; - } - }], [{ - key: "fromBase64", - value: function fromBase64(data) { - var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var buffer = Buffer.from(data, 'base64'); - return this.fromBuffer(buffer, opts); - } - }, { - key: "fromHex", - value: function fromHex(data) { - var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var buffer = Buffer.from(data, 'hex'); - return this.fromBuffer(buffer, opts); - } - }, { - key: "fromBuffer", - value: function fromBuffer(buffer) { - var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var psbtBase = bip174_1.Psbt.fromBuffer(buffer, transactionFromBuffer); - var psbt = new Psbt(opts, psbtBase); - checkTxForDupeIns(psbt.__CACHE.__TX, psbt.__CACHE); - return psbt; - } - }]); - - return Psbt; -}(); - -exports.Psbt = Psbt; -/** - * This function is needed to pass to the bip174 base class's fromBuffer. - * It takes the "transaction buffer" portion of the psbt buffer and returns a - * Transaction (From the bip174 library) interface. - */ - -var transactionFromBuffer = function transactionFromBuffer(buffer) { - return new PsbtTransaction(buffer); -}; -/** - * This class implements the Transaction interface from bip174 library. - * It contains a bitcoinjs-lib Transaction object. - */ - - -var PsbtTransaction = -/*#__PURE__*/ -function () { - function PsbtTransaction() { - var buffer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Buffer.from([2, 0, 0, 0, 0, 0, 0, 0, 0, 0]); - - _classCallCheck(this, PsbtTransaction); - - this.tx = transaction_1.Transaction.fromBuffer(buffer); - checkTxEmpty(this.tx); - Object.defineProperty(this, 'tx', { - enumerable: false, - writable: true - }); - } - - _createClass(PsbtTransaction, [{ - key: "getInputOutputCounts", - value: function getInputOutputCounts() { - return { - inputCount: this.tx.ins.length, - outputCount: this.tx.outs.length - }; - } - }, { - key: "addInput", - value: function addInput(input) { - if (input.hash === undefined || input.index === undefined || !Buffer.isBuffer(input.hash) && typeof input.hash !== 'string' || typeof input.index !== 'number') { - throw new Error('Error adding input.'); - } - - var hash = typeof input.hash === 'string' ? bufferutils_1.reverseBuffer(Buffer.from(input.hash, 'hex')) : input.hash; - this.tx.addInput(hash, input.index, input.sequence); - } - }, { - key: "addOutput", - value: function addOutput(output) { - if (output.script === undefined || output.value === undefined || !Buffer.isBuffer(output.script) || typeof output.value !== 'number') { - throw new Error('Error adding output.'); - } - - this.tx.addOutput(output.script, output.value); - } - }, { - key: "toBuffer", - value: function toBuffer() { - return this.tx.toBuffer(); - } - }]); - - return PsbtTransaction; -}(); - -function canFinalize(input, script, scriptType) { - switch (scriptType) { - case 'pubkey': - case 'pubkeyhash': - case 'witnesspubkeyhash': - return hasSigs(1, input.partialSig); - - case 'multisig': - var p2ms = payments.p2ms({ - output: script - }); - return hasSigs(p2ms.m, input.partialSig); - - default: - return false; - } -} - -function hasSigs(neededSigs, partialSig) { - if (!partialSig) return false; - if (partialSig.length > neededSigs) throw new Error('Too many signatures'); - return partialSig.length === neededSigs; -} - -function isFinalized(input) { - return !!input.finalScriptSig || !!input.finalScriptWitness; -} - -function isPaymentFactory(payment) { - return function (script) { - try { - payment({ - output: script - }); - return true; - } catch (err) { - return false; - } - }; -} - -var isP2MS = isPaymentFactory(payments.p2ms); -var isP2PK = isPaymentFactory(payments.p2pk); -var isP2PKH = isPaymentFactory(payments.p2pkh); -var isP2WPKH = isPaymentFactory(payments.p2wpkh); -var isP2WSHScript = isPaymentFactory(payments.p2wsh); - -function check32Bit(num) { - if (typeof num !== 'number' || num !== Math.floor(num) || num > 0xffffffff || num < 0) { - throw new Error('Invalid 32 bit integer'); - } -} - -function checkFees(psbt, cache, opts) { - var feeRate = cache.__FEE_RATE || psbt.getFeeRate(); - - var vsize = cache.__EXTRACTED_TX.virtualSize(); - - var satoshis = feeRate * vsize; - - if (feeRate >= opts.maximumFeeRate) { - throw new Error("Warning: You are paying around ".concat((satoshis / 1e8).toFixed(8), " in ") + "fees, which is ".concat(feeRate, " satoshi per byte for a transaction ") + "with a VSize of ".concat(vsize, " bytes (segwit counted as 0.25 byte per ") + "byte). Use setMaximumFeeRate method to raise your threshold, or " + "pass true to the first arg of extractTransaction."); - } -} - -function checkInputsForPartialSig(inputs, action) { - inputs.forEach(function (input) { - var throws = false; - var pSigs = []; - - if ((input.partialSig || []).length === 0) { - if (!input.finalScriptSig && !input.finalScriptWitness) return; - pSigs = getPsigsFromInputFinalScripts(input); - } else { - pSigs = input.partialSig; - } - - pSigs.forEach(function (pSig) { - var _bscript$signature$de = bscript.signature.decode(pSig.signature), - hashType = _bscript$signature$de.hashType; - - var whitelist = []; - var isAnyoneCanPay = hashType & transaction_1.Transaction.SIGHASH_ANYONECANPAY; - if (isAnyoneCanPay) whitelist.push('addInput'); - var hashMod = hashType & 0x1f; - - switch (hashMod) { - case transaction_1.Transaction.SIGHASH_ALL: - break; - - case transaction_1.Transaction.SIGHASH_SINGLE: - case transaction_1.Transaction.SIGHASH_NONE: - whitelist.push('addOutput'); - whitelist.push('setInputSequence'); - break; - } - - if (whitelist.indexOf(action) === -1) { - throws = true; - } - }); - - if (throws) { - throw new Error('Can not modify transaction, signatures exist.'); - } - }); -} - -function checkPartialSigSighashes(input) { - if (!input.sighashType || !input.partialSig) return; - var partialSig = input.partialSig, - sighashType = input.sighashType; - partialSig.forEach(function (pSig) { - var _bscript$signature$de2 = bscript.signature.decode(pSig.signature), - hashType = _bscript$signature$de2.hashType; - - if (sighashType !== hashType) { - throw new Error('Signature sighash does not match input sighash type'); - } - }); -} - -function checkScriptForPubkey(pubkey, script, action) { - var pubkeyHash = crypto_1.hash160(pubkey); - var decompiled = bscript.decompile(script); - if (decompiled === null) throw new Error('Unknown script error'); - var hasKey = decompiled.some(function (element) { - if (typeof element === 'number') return false; - return element.equals(pubkey) || element.equals(pubkeyHash); - }); - - if (!hasKey) { - throw new Error("Can not ".concat(action, " for this input with the key ").concat(pubkey.toString('hex'))); - } -} - -function checkTxEmpty(tx) { - var isEmpty = tx.ins.every(function (input) { - return input.script && input.script.length === 0 && input.witness && input.witness.length === 0; - }); - - if (!isEmpty) { - throw new Error('Format Error: Transaction ScriptSigs are not empty'); - } -} - -function checkTxForDupeIns(tx, cache) { - tx.ins.forEach(function (input) { - checkTxInputCache(cache, input); - }); -} - -function checkTxInputCache(cache, input) { - var key = bufferutils_1.reverseBuffer(Buffer.from(input.hash)).toString('hex') + ':' + input.index; - if (cache.__TX_IN_CACHE[key]) throw new Error('Duplicate input detected.'); - cache.__TX_IN_CACHE[key] = 1; -} - -function scriptCheckerFactory(payment, paymentScriptName) { - return function (inputIndex, scriptPubKey, redeemScript) { - var redeemScriptOutput = payment({ - redeem: { - output: redeemScript - } - }).output; - - if (!scriptPubKey.equals(redeemScriptOutput)) { - throw new Error("".concat(paymentScriptName, " for input #").concat(inputIndex, " doesn't match the scriptPubKey in the prevout")); - } - }; -} - -var checkRedeemScript = scriptCheckerFactory(payments.p2sh, 'Redeem script'); -var checkWitnessScript = scriptCheckerFactory(payments.p2wsh, 'Witness script'); - -function getTxCacheValue(key, name, inputs, c) { - if (!inputs.every(isFinalized)) throw new Error("PSBT must be finalized to calculate ".concat(name)); - if (key === '__FEE_RATE' && c.__FEE_RATE) return c.__FEE_RATE; - if (key === '__FEE' && c.__FEE) return c.__FEE; - var tx; - var mustFinalize = true; - - if (c.__EXTRACTED_TX) { - tx = c.__EXTRACTED_TX; - mustFinalize = false; - } else { - tx = c.__TX.clone(); - } - - inputFinalizeGetAmts(inputs, tx, c, mustFinalize); - if (key === '__FEE_RATE') return c.__FEE_RATE;else if (key === '__FEE') return c.__FEE; -} - -function getFinalScripts(script, scriptType, partialSig, isSegwit, isP2SH, isP2WSH) { - var finalScriptSig; - var finalScriptWitness; // Wow, the payments API is very handy - - var payment = getPayment(script, scriptType, partialSig); - var p2wsh = !isP2WSH ? null : payments.p2wsh({ - redeem: payment - }); - var p2sh = !isP2SH ? null : payments.p2sh({ - redeem: p2wsh || payment - }); - - if (isSegwit) { - if (p2wsh) { - finalScriptWitness = witnessStackToScriptWitness(p2wsh.witness); - } else { - finalScriptWitness = witnessStackToScriptWitness(payment.witness); - } - - if (p2sh) { - finalScriptSig = p2sh.input; - } - } else { - if (p2sh) { - finalScriptSig = p2sh.input; - } else { - finalScriptSig = payment.input; - } - } - - return { - finalScriptSig: finalScriptSig, - finalScriptWitness: finalScriptWitness - }; -} - -function getHashAndSighashType(inputs, inputIndex, pubkey, cache, sighashTypes) { - var input = utils_1.checkForInput(inputs, inputIndex); - - var _getHashForSig = getHashForSig(inputIndex, input, cache, sighashTypes), - hash = _getHashForSig.hash, - sighashType = _getHashForSig.sighashType, - script = _getHashForSig.script; - - checkScriptForPubkey(pubkey, script, 'sign'); - return { - hash: hash, - sighashType: sighashType - }; -} - -function getHashForSig(inputIndex, input, cache, sighashTypes) { - var unsignedTx = cache.__TX; - var sighashType = input.sighashType || transaction_1.Transaction.SIGHASH_ALL; - - if (sighashTypes && sighashTypes.indexOf(sighashType) < 0) { - var str = sighashTypeToString(sighashType); - throw new Error("Sighash type is not allowed. Retry the sign method passing the " + "sighashTypes array of whitelisted types. Sighash type: ".concat(str)); - } - - var hash; - var script; - - if (input.nonWitnessUtxo) { - var nonWitnessUtxoTx = nonWitnessUtxoTxFromCache(cache, input, inputIndex); - var prevoutHash = unsignedTx.ins[inputIndex].hash; - var utxoHash = nonWitnessUtxoTx.getHash(); // If a non-witness UTXO is provided, its hash must match the hash specified in the prevout - - if (!prevoutHash.equals(utxoHash)) { - throw new Error("Non-witness UTXO hash for input #".concat(inputIndex, " doesn't match the hash specified in the prevout")); - } - - var prevoutIndex = unsignedTx.ins[inputIndex].index; - var prevout = nonWitnessUtxoTx.outs[prevoutIndex]; - - if (input.redeemScript) { - // If a redeemScript is provided, the scriptPubKey must be for that redeemScript - checkRedeemScript(inputIndex, prevout.script, input.redeemScript); - script = input.redeemScript; - } else { - script = prevout.script; - } - - if (isP2WSHScript(script)) { - if (!input.witnessScript) throw new Error('Segwit input needs witnessScript if not P2WPKH'); - checkWitnessScript(inputIndex, script, input.witnessScript); - hash = unsignedTx.hashForWitnessV0(inputIndex, input.witnessScript, prevout.value, sighashType); - script = input.witnessScript; - } else if (isP2WPKH(script)) { - // P2WPKH uses the P2PKH template for prevoutScript when signing - var signingScript = payments.p2pkh({ - hash: script.slice(2) - }).output; - hash = unsignedTx.hashForWitnessV0(inputIndex, signingScript, prevout.value, sighashType); - } else { - hash = unsignedTx.hashForSignature(inputIndex, script, sighashType); - } - } else if (input.witnessUtxo) { - var _script; // so we don't shadow the `let script` above - - - if (input.redeemScript) { - // If a redeemScript is provided, the scriptPubKey must be for that redeemScript - checkRedeemScript(inputIndex, input.witnessUtxo.script, input.redeemScript); - _script = input.redeemScript; - } else { - _script = input.witnessUtxo.script; - } - - if (isP2WPKH(_script)) { - // P2WPKH uses the P2PKH template for prevoutScript when signing - var _signingScript = payments.p2pkh({ - hash: _script.slice(2) - }).output; - hash = unsignedTx.hashForWitnessV0(inputIndex, _signingScript, input.witnessUtxo.value, sighashType); - script = _script; - } else if (isP2WSHScript(_script)) { - if (!input.witnessScript) throw new Error('Segwit input needs witnessScript if not P2WPKH'); - checkWitnessScript(inputIndex, _script, input.witnessScript); - hash = unsignedTx.hashForWitnessV0(inputIndex, input.witnessScript, input.witnessUtxo.value, sighashType); // want to make sure the script we return is the actual meaningful script - - script = input.witnessScript; - } else { - throw new Error("Input #".concat(inputIndex, " has witnessUtxo but non-segwit script: ") + "".concat(_script.toString('hex'))); - } - } else { - throw new Error('Need a Utxo input item for signing'); - } - - return { - script: script, - sighashType: sighashType, - hash: hash - }; -} - -function getPayment(script, scriptType, partialSig) { - var payment; - - switch (scriptType) { - case 'multisig': - var sigs = getSortedSigs(script, partialSig); - payment = payments.p2ms({ - output: script, - signatures: sigs - }); - break; - - case 'pubkey': - payment = payments.p2pk({ - output: script, - signature: partialSig[0].signature - }); - break; - - case 'pubkeyhash': - payment = payments.p2pkh({ - output: script, - pubkey: partialSig[0].pubkey, - signature: partialSig[0].signature - }); - break; - - case 'witnesspubkeyhash': - payment = payments.p2wpkh({ - output: script, - pubkey: partialSig[0].pubkey, - signature: partialSig[0].signature - }); - break; - } - - return payment; -} - -function getPsigsFromInputFinalScripts(input) { - var scriptItems = !input.finalScriptSig ? [] : bscript.decompile(input.finalScriptSig) || []; - var witnessItems = !input.finalScriptWitness ? [] : bscript.decompile(input.finalScriptWitness) || []; - return scriptItems.concat(witnessItems).filter(function (item) { - return Buffer.isBuffer(item) && bscript.isCanonicalScriptSignature(item); - }).map(function (sig) { - return { - signature: sig - }; - }); -} - -function getScriptFromInput(inputIndex, input, cache) { - var unsignedTx = cache.__TX; - var res = { - script: null, - isSegwit: false, - isP2SH: false, - isP2WSH: false - }; - res.isP2SH = !!input.redeemScript; - res.isP2WSH = !!input.witnessScript; - - if (input.witnessScript) { - res.script = input.witnessScript; - } else if (input.redeemScript) { - res.script = input.redeemScript; - } else { - if (input.nonWitnessUtxo) { - var nonWitnessUtxoTx = nonWitnessUtxoTxFromCache(cache, input, inputIndex); - var prevoutIndex = unsignedTx.ins[inputIndex].index; - res.script = nonWitnessUtxoTx.outs[prevoutIndex].script; - } else if (input.witnessUtxo) { - res.script = input.witnessUtxo.script; - } - } - - if (input.witnessScript || isP2WPKH(res.script)) { - res.isSegwit = true; - } - - return res; -} - -function getSignersFromHD(inputIndex, inputs, hdKeyPair) { - var input = utils_1.checkForInput(inputs, inputIndex); - - if (!input.bip32Derivation || input.bip32Derivation.length === 0) { - throw new Error('Need bip32Derivation to sign with HD'); - } - - var myDerivations = input.bip32Derivation.map(function (bipDv) { - if (bipDv.masterFingerprint.equals(hdKeyPair.fingerprint)) { - return bipDv; - } else { - return; - } - }).filter(function (v) { - return !!v; - }); - - if (myDerivations.length === 0) { - throw new Error('Need one bip32Derivation masterFingerprint to match the HDSigner fingerprint'); - } - - var signers = myDerivations.map(function (bipDv) { - var node = hdKeyPair.derivePath(bipDv.path); - - if (!bipDv.pubkey.equals(node.publicKey)) { - throw new Error('pubkey did not match bip32Derivation'); - } - - return node; - }); - return signers; -} - -function getSortedSigs(script, partialSig) { - var p2ms = payments.p2ms({ - output: script - }); // for each pubkey in order of p2ms script - - return p2ms.pubkeys.map(function (pk) { - // filter partialSig array by pubkey being equal - return (partialSig.filter(function (ps) { - return ps.pubkey.equals(pk); - })[0] || {}).signature; // Any pubkey without a match will return undefined - // this last filter removes all the undefined items in the array. - }).filter(function (v) { - return !!v; - }); -} - -function scriptWitnessToWitnessStack(buffer) { - var offset = 0; - - function readSlice(n) { - offset += n; - return buffer.slice(offset - n, offset); - } - - function readVarInt() { - var vi = varuint.decode(buffer, offset); - offset += varuint.decode.bytes; - return vi; - } - - function readVarSlice() { - return readSlice(readVarInt()); - } - - function readVector() { - var count = readVarInt(); - var vector = []; - - for (var i = 0; i < count; i++) { - vector.push(readVarSlice()); - } - - return vector; - } - - return readVector(); -} - -function sighashTypeToString(sighashType) { - var text = sighashType & transaction_1.Transaction.SIGHASH_ANYONECANPAY ? 'SIGHASH_ANYONECANPAY | ' : ''; - var sigMod = sighashType & 0x1f; - - switch (sigMod) { - case transaction_1.Transaction.SIGHASH_ALL: - text += 'SIGHASH_ALL'; - break; - - case transaction_1.Transaction.SIGHASH_SINGLE: - text += 'SIGHASH_SINGLE'; - break; - - case transaction_1.Transaction.SIGHASH_NONE: - text += 'SIGHASH_NONE'; - break; - } - - return text; -} - -function witnessStackToScriptWitness(witness) { - var buffer = Buffer.allocUnsafe(0); - - function writeSlice(slice) { - buffer = Buffer.concat([buffer, Buffer.from(slice)]); - } - - function writeVarInt(i) { - var currentLen = buffer.length; - var varintLen = varuint.encodingLength(i); - buffer = Buffer.concat([buffer, Buffer.allocUnsafe(varintLen)]); - varuint.encode(i, buffer, currentLen); - } - - function writeVarSlice(slice) { - writeVarInt(slice.length); - writeSlice(slice); - } - - function writeVector(vector) { - writeVarInt(vector.length); - vector.forEach(writeVarSlice); - } - - writeVector(witness); - return buffer; -} - -function addNonWitnessTxCache(cache, input, inputIndex) { - cache.__NON_WITNESS_UTXO_BUF_CACHE[inputIndex] = input.nonWitnessUtxo; - var tx = transaction_1.Transaction.fromBuffer(input.nonWitnessUtxo); - cache.__NON_WITNESS_UTXO_TX_CACHE[inputIndex] = tx; - var self = cache; - var selfIndex = inputIndex; - delete input.nonWitnessUtxo; - Object.defineProperty(input, 'nonWitnessUtxo', { - enumerable: true, - get: function get() { - var buf = self.__NON_WITNESS_UTXO_BUF_CACHE[selfIndex]; - var txCache = self.__NON_WITNESS_UTXO_TX_CACHE[selfIndex]; - - if (buf !== undefined) { - return buf; - } else { - var newBuf = txCache.toBuffer(); - self.__NON_WITNESS_UTXO_BUF_CACHE[selfIndex] = newBuf; - return newBuf; - } - }, - set: function set(data) { - self.__NON_WITNESS_UTXO_BUF_CACHE[selfIndex] = data; - } - }); -} - -function inputFinalizeGetAmts(inputs, tx, cache, mustFinalize) { - var inputAmount = 0; - inputs.forEach(function (input, idx) { - if (mustFinalize && input.finalScriptSig) tx.ins[idx].script = input.finalScriptSig; - - if (mustFinalize && input.finalScriptWitness) { - tx.ins[idx].witness = scriptWitnessToWitnessStack(input.finalScriptWitness); - } - - if (input.witnessUtxo) { - inputAmount += input.witnessUtxo.value; - } else if (input.nonWitnessUtxo) { - var nwTx = nonWitnessUtxoTxFromCache(cache, input, idx); - var vout = tx.ins[idx].index; - var out = nwTx.outs[vout]; - inputAmount += out.value; - } - }); - var outputAmount = tx.outs.reduce(function (total, o) { - return total + o.value; - }, 0); - var fee = inputAmount - outputAmount; - - if (fee < 0) { - throw new Error('Outputs are spending more than Inputs'); - } - - var bytes = tx.virtualSize(); - cache.__FEE = fee; - cache.__EXTRACTED_TX = tx; - cache.__FEE_RATE = Math.floor(fee / bytes); -} - -function nonWitnessUtxoTxFromCache(cache, input, inputIndex) { - var c = cache.__NON_WITNESS_UTXO_TX_CACHE; - - if (!c[inputIndex]) { - addNonWitnessTxCache(cache, input, inputIndex); - } - - return c[inputIndex]; -} - -function classifyScript(script) { - if (isP2WPKH(script)) return 'witnesspubkeyhash'; - if (isP2PKH(script)) return 'pubkeyhash'; - if (isP2MS(script)) return 'multisig'; - if (isP2PK(script)) return 'pubkey'; - return 'nonstandard'; -} - -function range(n) { - return _toConsumableArray(Array(n).keys()); -} -},{"bip174":"Kgzo","bip174/src/lib/converter/varint":"ViXA","bip174/src/lib/utils":"GfFi","./address":"wUUe","./bufferutils":"jFwl","./crypto":"uv3I","./ecpair":"ZFsm","./networks":"rvS6","./payments":"kEsd","./script":"Fa8t","./transaction":"Y9UO","buffer":"dskh"}],"rcO3":[function(require,module,exports) { -'use strict'; // OP_0 [signatures ...] - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var bscript = require('../../script'); - -var script_1 = require('../../script'); - -function partialSignature(value) { - return value === script_1.OPS.OP_0 || bscript.isCanonicalScriptSignature(value); -} - -function check(script, allowIncomplete) { - var chunks = bscript.decompile(script); - if (chunks.length < 2) return false; - if (chunks[0] !== script_1.OPS.OP_0) return false; - - if (allowIncomplete) { - return chunks.slice(1).every(partialSignature); - } - - return chunks.slice(1).every(bscript.isCanonicalScriptSignature); -} - -exports.check = check; - -check.toJSON = function () { - return 'multisig input'; -}; -},{"../../script":"Fa8t"}],"p6tM":[function(require,module,exports) { -'use strict'; // m [pubKeys ...] n OP_CHECKMULTISIG - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var bscript = require('../../script'); - -var script_1 = require('../../script'); - -var types = require('../../types'); - -var OP_INT_BASE = script_1.OPS.OP_RESERVED; // OP_1 - 1 - -function check(script, allowIncomplete) { - var chunks = bscript.decompile(script); - if (chunks.length < 4) return false; - if (chunks[chunks.length - 1] !== script_1.OPS.OP_CHECKMULTISIG) return false; - if (!types.Number(chunks[0])) return false; - if (!types.Number(chunks[chunks.length - 2])) return false; - var m = chunks[0] - OP_INT_BASE; - var n = chunks[chunks.length - 2] - OP_INT_BASE; - if (m <= 0) return false; - if (n > 16) return false; - if (m > n) return false; - if (n !== chunks.length - 3) return false; - if (allowIncomplete) return true; - var keys = chunks.slice(1, -2); - return keys.every(bscript.isCanonicalPubKey); -} - -exports.check = check; - -check.toJSON = function () { - return 'multi-sig output'; -}; -},{"../../script":"Fa8t","../../types":"TQ2w"}],"tAvT":[function(require,module,exports) { -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var input = require('./input'); - -exports.input = input; - -var output = require('./output'); - -exports.output = output; -},{"./input":"rcO3","./output":"p6tM"}],"fKxi":[function(require,module,exports) { -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); // OP_RETURN {data} - -var bscript = require('../script'); - -var OPS = bscript.OPS; - -function check(script) { - var buffer = bscript.compile(script); - return buffer.length > 1 && buffer[0] === OPS.OP_RETURN; -} - -exports.check = check; - -check.toJSON = function () { - return 'null data output'; -}; - -var output = { - check: check -}; -exports.output = output; -},{"../script":"Fa8t"}],"X9Co":[function(require,module,exports) { -'use strict'; // {signature} - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var bscript = require('../../script'); - -function check(script) { - var chunks = bscript.decompile(script); - return chunks.length === 1 && bscript.isCanonicalScriptSignature(chunks[0]); -} - -exports.check = check; - -check.toJSON = function () { - return 'pubKey input'; -}; -},{"../../script":"Fa8t"}],"ugmf":[function(require,module,exports) { -'use strict'; // {pubKey} OP_CHECKSIG - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var bscript = require('../../script'); - -var script_1 = require('../../script'); - -function check(script) { - var chunks = bscript.decompile(script); - return chunks.length === 2 && bscript.isCanonicalPubKey(chunks[0]) && chunks[1] === script_1.OPS.OP_CHECKSIG; -} - -exports.check = check; - -check.toJSON = function () { - return 'pubKey output'; -}; -},{"../../script":"Fa8t"}],"l7Lh":[function(require,module,exports) { -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var input = require('./input'); - -exports.input = input; - -var output = require('./output'); - -exports.output = output; -},{"./input":"X9Co","./output":"ugmf"}],"dYUv":[function(require,module,exports) { -'use strict'; // {signature} {pubKey} - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var bscript = require('../../script'); - -function check(script) { - var chunks = bscript.decompile(script); - return chunks.length === 2 && bscript.isCanonicalScriptSignature(chunks[0]) && bscript.isCanonicalPubKey(chunks[1]); -} - -exports.check = check; - -check.toJSON = function () { - return 'pubKeyHash input'; -}; -},{"../../script":"Fa8t"}],"omA2":[function(require,module,exports) { -'use strict'; // OP_DUP OP_HASH160 {pubKeyHash} OP_EQUALVERIFY OP_CHECKSIG - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var bscript = require('../../script'); - -var script_1 = require('../../script'); - -function check(script) { - var buffer = bscript.compile(script); - return buffer.length === 25 && buffer[0] === script_1.OPS.OP_DUP && buffer[1] === script_1.OPS.OP_HASH160 && buffer[2] === 0x14 && buffer[23] === script_1.OPS.OP_EQUALVERIFY && buffer[24] === script_1.OPS.OP_CHECKSIG; -} - -exports.check = check; - -check.toJSON = function () { - return 'pubKeyHash output'; -}; -},{"../../script":"Fa8t"}],"Sk1x":[function(require,module,exports) { -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var input = require('./input'); - -exports.input = input; - -var output = require('./output'); - -exports.output = output; -},{"./input":"dYUv","./output":"omA2"}],"eaHZ":[function(require,module,exports) { -'use strict'; // OP_0 {pubKeyHash} - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var bscript = require('../../script'); - -var script_1 = require('../../script'); - -function check(script) { - var buffer = bscript.compile(script); - return buffer.length === 22 && buffer[0] === script_1.OPS.OP_0 && buffer[1] === 0x14; -} - -exports.check = check; - -check.toJSON = function () { - return 'Witness pubKeyHash output'; -}; -},{"../../script":"Fa8t"}],"n1wb":[function(require,module,exports) { -'use strict'; // OP_0 {scriptHash} - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var bscript = require('../../script'); - -var script_1 = require('../../script'); - -function check(script) { - var buffer = bscript.compile(script); - return buffer.length === 34 && buffer[0] === script_1.OPS.OP_0 && buffer[1] === 0x20; -} - -exports.check = check; - -check.toJSON = function () { - return 'Witness scriptHash output'; -}; -},{"../../script":"Fa8t"}],"yF64":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; // {serialized scriptPubKey script} - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var bscript = require('../../script'); - -var p2ms = require('../multisig'); - -var p2pk = require('../pubkey'); - -var p2pkh = require('../pubkeyhash'); - -var p2wpkho = require('../witnesspubkeyhash/output'); - -var p2wsho = require('../witnessscripthash/output'); - -function check(script, allowIncomplete) { - var chunks = bscript.decompile(script); - if (chunks.length < 1) return false; - var lastChunk = chunks[chunks.length - 1]; - if (!Buffer.isBuffer(lastChunk)) return false; - var scriptSigChunks = bscript.decompile(bscript.compile(chunks.slice(0, -1))); - var redeemScriptChunks = bscript.decompile(lastChunk); // is redeemScript a valid script? - - if (!redeemScriptChunks) return false; // is redeemScriptSig push only? - - if (!bscript.isPushOnly(scriptSigChunks)) return false; // is witness? - - if (chunks.length === 1) { - return p2wsho.check(redeemScriptChunks) || p2wpkho.check(redeemScriptChunks); - } // match types - - - if (p2pkh.input.check(scriptSigChunks) && p2pkh.output.check(redeemScriptChunks)) return true; - if (p2ms.input.check(scriptSigChunks, allowIncomplete) && p2ms.output.check(redeemScriptChunks)) return true; - if (p2pk.input.check(scriptSigChunks) && p2pk.output.check(redeemScriptChunks)) return true; - return false; -} - -exports.check = check; - -check.toJSON = function () { - return 'scriptHash input'; -}; -},{"../../script":"Fa8t","../multisig":"tAvT","../pubkey":"l7Lh","../pubkeyhash":"Sk1x","../witnesspubkeyhash/output":"eaHZ","../witnessscripthash/output":"n1wb","buffer":"dskh"}],"cCec":[function(require,module,exports) { -'use strict'; // OP_HASH160 {scriptHash} OP_EQUAL - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var bscript = require('../../script'); - -var script_1 = require('../../script'); - -function check(script) { - var buffer = bscript.compile(script); - return buffer.length === 23 && buffer[0] === script_1.OPS.OP_HASH160 && buffer[1] === 0x14 && buffer[22] === script_1.OPS.OP_EQUAL; -} - -exports.check = check; - -check.toJSON = function () { - return 'scriptHash output'; -}; -},{"../../script":"Fa8t"}],"g7LS":[function(require,module,exports) { -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var input = require('./input'); - -exports.input = input; - -var output = require('./output'); - -exports.output = output; -},{"./input":"yF64","./output":"cCec"}],"hYj9":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; // OP_RETURN {aa21a9ed} {commitment} - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var bscript = require('../../script'); - -var script_1 = require('../../script'); - -var types = require('../../types'); - -var typeforce = require('typeforce'); - -var HEADER = Buffer.from('aa21a9ed', 'hex'); - -function check(script) { - var buffer = bscript.compile(script); - return buffer.length > 37 && buffer[0] === script_1.OPS.OP_RETURN && buffer[1] === 0x24 && buffer.slice(2, 6).equals(HEADER); -} - -exports.check = check; - -check.toJSON = function () { - return 'Witness commitment output'; -}; - -function encode(commitment) { - typeforce(types.Hash256bit, commitment); - var buffer = Buffer.allocUnsafe(36); - HEADER.copy(buffer, 0); - commitment.copy(buffer, 4); - return bscript.compile([script_1.OPS.OP_RETURN, buffer]); -} - -exports.encode = encode; - -function decode(buffer) { - typeforce(check, buffer); - return bscript.decompile(buffer)[1].slice(4, 36); -} - -exports.decode = decode; -},{"../../script":"Fa8t","../../types":"TQ2w","typeforce":"PKU7","buffer":"dskh"}],"ieyO":[function(require,module,exports) { -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var output = require('./output'); - -exports.output = output; -},{"./output":"hYj9"}],"SH0d":[function(require,module,exports) { -'use strict'; // {signature} {pubKey} - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var bscript = require('../../script'); - -function isCompressedCanonicalPubKey(pubKey) { - return bscript.isCanonicalPubKey(pubKey) && pubKey.length === 33; -} - -function check(script) { - var chunks = bscript.decompile(script); - return chunks.length === 2 && bscript.isCanonicalScriptSignature(chunks[0]) && isCompressedCanonicalPubKey(chunks[1]); -} - -exports.check = check; - -check.toJSON = function () { - return 'witnessPubKeyHash input'; -}; -},{"../../script":"Fa8t"}],"ytFA":[function(require,module,exports) { -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var input = require('./input'); - -exports.input = input; - -var output = require('./output'); - -exports.output = output; -},{"./input":"SH0d","./output":"eaHZ"}],"sLl4":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; // {serialized scriptPubKey script} - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var bscript = require('../../script'); - -var typeforce = require('typeforce'); - -var p2ms = require('../multisig'); - -var p2pk = require('../pubkey'); - -var p2pkh = require('../pubkeyhash'); - -function check(chunks, allowIncomplete) { - typeforce(typeforce.Array, chunks); - if (chunks.length < 1) return false; - var witnessScript = chunks[chunks.length - 1]; - if (!Buffer.isBuffer(witnessScript)) return false; - var witnessScriptChunks = bscript.decompile(witnessScript); // is witnessScript a valid script? - - if (!witnessScriptChunks || witnessScriptChunks.length === 0) return false; - var witnessRawScriptSig = bscript.compile(chunks.slice(0, -1)); // match types - - if (p2pkh.input.check(witnessRawScriptSig) && p2pkh.output.check(witnessScriptChunks)) return true; - if (p2ms.input.check(witnessRawScriptSig, allowIncomplete) && p2ms.output.check(witnessScriptChunks)) return true; - if (p2pk.input.check(witnessRawScriptSig) && p2pk.output.check(witnessScriptChunks)) return true; - return false; -} - -exports.check = check; - -check.toJSON = function () { - return 'witnessScriptHash input'; -}; -},{"../../script":"Fa8t","typeforce":"PKU7","../multisig":"tAvT","../pubkey":"l7Lh","../pubkeyhash":"Sk1x","buffer":"dskh"}],"kzpC":[function(require,module,exports) { -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var input = require('./input'); - -exports.input = input; - -var output = require('./output'); - -exports.output = output; -},{"./input":"sLl4","./output":"n1wb"}],"I041":[function(require,module,exports) { -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var script_1 = require('./script'); - -var multisig = require('./templates/multisig'); - -var nullData = require('./templates/nulldata'); - -var pubKey = require('./templates/pubkey'); - -var pubKeyHash = require('./templates/pubkeyhash'); - -var scriptHash = require('./templates/scripthash'); - -var witnessCommitment = require('./templates/witnesscommitment'); - -var witnessPubKeyHash = require('./templates/witnesspubkeyhash'); - -var witnessScriptHash = require('./templates/witnessscripthash'); - -var types = { - P2MS: 'multisig', - NONSTANDARD: 'nonstandard', - NULLDATA: 'nulldata', - P2PK: 'pubkey', - P2PKH: 'pubkeyhash', - P2SH: 'scripthash', - P2WPKH: 'witnesspubkeyhash', - P2WSH: 'witnessscripthash', - WITNESS_COMMITMENT: 'witnesscommitment' -}; -exports.types = types; - -function classifyOutput(script) { - if (witnessPubKeyHash.output.check(script)) return types.P2WPKH; - if (witnessScriptHash.output.check(script)) return types.P2WSH; - if (pubKeyHash.output.check(script)) return types.P2PKH; - if (scriptHash.output.check(script)) return types.P2SH; // XXX: optimization, below functions .decompile before use - - var chunks = script_1.decompile(script); - if (!chunks) throw new TypeError('Invalid script'); - if (multisig.output.check(chunks)) return types.P2MS; - if (pubKey.output.check(chunks)) return types.P2PK; - if (witnessCommitment.output.check(chunks)) return types.WITNESS_COMMITMENT; - if (nullData.output.check(chunks)) return types.NULLDATA; - return types.NONSTANDARD; -} - -exports.output = classifyOutput; - -function classifyInput(script, allowIncomplete) { - // XXX: optimization, below functions .decompile before use - var chunks = script_1.decompile(script); - if (!chunks) throw new TypeError('Invalid script'); - if (pubKeyHash.input.check(chunks)) return types.P2PKH; - if (scriptHash.input.check(chunks, allowIncomplete)) return types.P2SH; - if (multisig.input.check(chunks, allowIncomplete)) return types.P2MS; - if (pubKey.input.check(chunks)) return types.P2PK; - return types.NONSTANDARD; -} - -exports.input = classifyInput; - -function classifyWitness(script, allowIncomplete) { - // XXX: optimization, below functions .decompile before use - var chunks = script_1.decompile(script); - if (!chunks) throw new TypeError('Invalid script'); - if (witnessPubKeyHash.input.check(chunks)) return types.P2WPKH; - if (witnessScriptHash.input.check(chunks, allowIncomplete)) return types.P2WSH; - return types.NONSTANDARD; -} - -exports.witness = classifyWitness; -},{"./script":"Fa8t","./templates/multisig":"tAvT","./templates/nulldata":"fKxi","./templates/pubkey":"l7Lh","./templates/pubkeyhash":"Sk1x","./templates/scripthash":"g7LS","./templates/witnesscommitment":"ieyO","./templates/witnesspubkeyhash":"ytFA","./templates/witnessscripthash":"kzpC"}],"k6oC":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -'use strict'; - -function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } - -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } - -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } - -function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var baddress = require('./address'); - -var bufferutils_1 = require('./bufferutils'); - -var classify = require('./classify'); - -var bcrypto = require('./crypto'); - -var ECPair = require('./ecpair'); - -var networks = require('./networks'); - -var payments = require('./payments'); - -var bscript = require('./script'); - -var script_1 = require('./script'); - -var transaction_1 = require('./transaction'); - -var types = require('./types'); - -var typeforce = require('typeforce'); - -var SCRIPT_TYPES = classify.types; -var PREVOUT_TYPES = new Set([// Raw -'p2pkh', 'p2pk', 'p2wpkh', 'p2ms', // P2SH wrapped -'p2sh-p2pkh', 'p2sh-p2pk', 'p2sh-p2wpkh', 'p2sh-p2ms', // P2WSH wrapped -'p2wsh-p2pkh', 'p2wsh-p2pk', 'p2wsh-p2ms', // P2SH-P2WSH wrapper -'p2sh-p2wsh-p2pkh', 'p2sh-p2wsh-p2pk', 'p2sh-p2wsh-p2ms']); - -function tfMessage(type, value, message) { - try { - typeforce(type, value); - } catch (err) { - throw new Error(message); - } -} - -function txIsString(tx) { - return typeof tx === 'string' || tx instanceof String; -} - -function txIsTransaction(tx) { - return tx instanceof transaction_1.Transaction; -} - -var TransactionBuilder = -/*#__PURE__*/ -function () { - // WARNING: maximumFeeRate is __NOT__ to be relied on, - // it's just another potential safety mechanism (safety in-depth) - function TransactionBuilder() { - var network = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : networks.bitcoin; - var maximumFeeRate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2500; - - _classCallCheck(this, TransactionBuilder); - - this.network = network; - this.maximumFeeRate = maximumFeeRate; - this.__PREV_TX_SET = {}; - this.__INPUTS = []; - this.__TX = new transaction_1.Transaction(); - this.__TX.version = 2; - this.__USE_LOW_R = false; - console.warn('Deprecation Warning: TransactionBuilder will be removed in the future. ' + '(v6.x.x or later) Please use the Psbt class instead. Examples of usage ' + 'are available in the transactions-psbt.js integration test file on our ' + 'Github. A high level explanation is available in the psbt.ts and psbt.js ' + 'files as well.'); - } - - _createClass(TransactionBuilder, [{ - key: "setLowR", - value: function setLowR(setting) { - typeforce(typeforce.maybe(typeforce.Boolean), setting); - - if (setting === undefined) { - setting = true; - } - - this.__USE_LOW_R = setting; - return setting; - } - }, { - key: "setLockTime", - value: function setLockTime(locktime) { - typeforce(types.UInt32, locktime); // if any signatures exist, throw - - if (this.__INPUTS.some(function (input) { - if (!input.signatures) return false; - return input.signatures.some(function (s) { - return s !== undefined; - }); - })) { - throw new Error('No, this would invalidate signatures'); - } - - this.__TX.locktime = locktime; - } - }, { - key: "setVersion", - value: function setVersion(version) { - typeforce(types.UInt32, version); // XXX: this might eventually become more complex depending on what the versions represent - - this.__TX.version = version; - } - }, { - key: "addInput", - value: function addInput(txHash, vout, sequence, prevOutScript) { - if (!this.__canModifyInputs()) { - throw new Error('No, this would invalidate signatures'); - } - - var value; // is it a hex string? - - if (txIsString(txHash)) { - // transaction hashs's are displayed in reverse order, un-reverse it - txHash = bufferutils_1.reverseBuffer(Buffer.from(txHash, 'hex')); // is it a Transaction object? - } else if (txIsTransaction(txHash)) { - var txOut = txHash.outs[vout]; - prevOutScript = txOut.script; - value = txOut.value; - txHash = txHash.getHash(false); - } - - return this.__addInputUnsafe(txHash, vout, { - sequence: sequence, - prevOutScript: prevOutScript, - value: value - }); - } - }, { - key: "addOutput", - value: function addOutput(scriptPubKey, value) { - if (!this.__canModifyOutputs()) { - throw new Error('No, this would invalidate signatures'); - } // Attempt to get a script if it's a base58 or bech32 address string - - - if (typeof scriptPubKey === 'string') { - scriptPubKey = baddress.toOutputScript(scriptPubKey, this.network); - } - - return this.__TX.addOutput(scriptPubKey, value); - } - }, { - key: "build", - value: function build() { - return this.__build(false); - } - }, { - key: "buildIncomplete", - value: function buildIncomplete() { - return this.__build(true); - } - }, { - key: "sign", - value: function sign(signParams, keyPair, redeemScript, hashType, witnessValue, witnessScript) { - trySign(getSigningData(this.network, this.__INPUTS, this.__needsOutputs.bind(this), this.__TX, signParams, keyPair, redeemScript, hashType, witnessValue, witnessScript, this.__USE_LOW_R)); - } - }, { - key: "__addInputUnsafe", - value: function __addInputUnsafe(txHash, vout, options) { - if (transaction_1.Transaction.isCoinbaseHash(txHash)) { - throw new Error('coinbase inputs not supported'); - } - - var prevTxOut = txHash.toString('hex') + ':' + vout; - if (this.__PREV_TX_SET[prevTxOut] !== undefined) throw new Error('Duplicate TxOut: ' + prevTxOut); - var input = {}; // derive what we can from the scriptSig - - if (options.script !== undefined) { - input = expandInput(options.script, options.witness || []); - } // if an input value was given, retain it - - - if (options.value !== undefined) { - input.value = options.value; - } // derive what we can from the previous transactions output script - - - if (!input.prevOutScript && options.prevOutScript) { - var prevOutType; - - if (!input.pubkeys && !input.signatures) { - var expanded = expandOutput(options.prevOutScript); - - if (expanded.pubkeys) { - input.pubkeys = expanded.pubkeys; - input.signatures = expanded.signatures; - } - - prevOutType = expanded.type; - } - - input.prevOutScript = options.prevOutScript; - input.prevOutType = prevOutType || classify.output(options.prevOutScript); - } - - var vin = this.__TX.addInput(txHash, vout, options.sequence, options.scriptSig); - - this.__INPUTS[vin] = input; - this.__PREV_TX_SET[prevTxOut] = true; - return vin; - } - }, { - key: "__build", - value: function __build(allowIncomplete) { - if (!allowIncomplete) { - if (!this.__TX.ins.length) throw new Error('Transaction has no inputs'); - if (!this.__TX.outs.length) throw new Error('Transaction has no outputs'); - } - - var tx = this.__TX.clone(); // create script signatures from inputs - - - this.__INPUTS.forEach(function (input, i) { - if (!input.prevOutType && !allowIncomplete) throw new Error('Transaction is not complete'); - var result = build(input.prevOutType, input, allowIncomplete); - - if (!result) { - if (!allowIncomplete && input.prevOutType === SCRIPT_TYPES.NONSTANDARD) throw new Error('Unknown input type'); - if (!allowIncomplete) throw new Error('Not enough information'); - return; - } - - tx.setInputScript(i, result.input); - tx.setWitness(i, result.witness); - }); - - if (!allowIncomplete) { - // do not rely on this, its merely a last resort - if (this.__overMaximumFees(tx.virtualSize())) { - throw new Error('Transaction has absurd fees'); - } - } - - return tx; - } - }, { - key: "__canModifyInputs", - value: function __canModifyInputs() { - return this.__INPUTS.every(function (input) { - if (!input.signatures) return true; - return input.signatures.every(function (signature) { - if (!signature) return true; - var hashType = signatureHashType(signature); // if SIGHASH_ANYONECANPAY is set, signatures would not - // be invalidated by more inputs - - return (hashType & transaction_1.Transaction.SIGHASH_ANYONECANPAY) !== 0; - }); - }); - } - }, { - key: "__needsOutputs", - value: function __needsOutputs(signingHashType) { - if (signingHashType === transaction_1.Transaction.SIGHASH_ALL) { - return this.__TX.outs.length === 0; - } // if inputs are being signed with SIGHASH_NONE, we don't strictly need outputs - // .build() will fail, but .buildIncomplete() is OK - - - return this.__TX.outs.length === 0 && this.__INPUTS.some(function (input) { - if (!input.signatures) return false; - return input.signatures.some(function (signature) { - if (!signature) return false; // no signature, no issue - - var hashType = signatureHashType(signature); - if (hashType & transaction_1.Transaction.SIGHASH_NONE) return false; // SIGHASH_NONE doesn't care about outputs - - return true; // SIGHASH_* does care - }); - }); - } - }, { - key: "__canModifyOutputs", - value: function __canModifyOutputs() { - var nInputs = this.__TX.ins.length; - var nOutputs = this.__TX.outs.length; - return this.__INPUTS.every(function (input) { - if (input.signatures === undefined) return true; - return input.signatures.every(function (signature) { - if (!signature) return true; - var hashType = signatureHashType(signature); - var hashTypeMod = hashType & 0x1f; - if (hashTypeMod === transaction_1.Transaction.SIGHASH_NONE) return true; - - if (hashTypeMod === transaction_1.Transaction.SIGHASH_SINGLE) { - // if SIGHASH_SINGLE is set, and nInputs > nOutputs - // some signatures would be invalidated by the addition - // of more outputs - return nInputs <= nOutputs; - } - - return false; - }); - }); - } - }, { - key: "__overMaximumFees", - value: function __overMaximumFees(bytes) { - // not all inputs will have .value defined - var incoming = this.__INPUTS.reduce(function (a, x) { - return a + (x.value >>> 0); - }, 0); // but all outputs do, and if we have any input value - // we can immediately determine if the outputs are too small - - - var outgoing = this.__TX.outs.reduce(function (a, x) { - return a + x.value; - }, 0); - - var fee = incoming - outgoing; - var feeRate = fee / bytes; - return feeRate > this.maximumFeeRate; - } - }], [{ - key: "fromTransaction", - value: function fromTransaction(transaction, network) { - var txb = new TransactionBuilder(network); // Copy transaction fields - - txb.setVersion(transaction.version); - txb.setLockTime(transaction.locktime); // Copy outputs (done first to avoid signature invalidation) - - transaction.outs.forEach(function (txOut) { - txb.addOutput(txOut.script, txOut.value); - }); // Copy inputs - - transaction.ins.forEach(function (txIn) { - txb.__addInputUnsafe(txIn.hash, txIn.index, { - sequence: txIn.sequence, - script: txIn.script, - witness: txIn.witness - }); - }); // fix some things not possible through the public API - - txb.__INPUTS.forEach(function (input, i) { - fixMultisigOrder(input, transaction, i); - }); - - return txb; - } - }]); - - return TransactionBuilder; -}(); - -exports.TransactionBuilder = TransactionBuilder; - -function expandInput(scriptSig, witnessStack, type, scriptPubKey) { - if (scriptSig.length === 0 && witnessStack.length === 0) return {}; - - if (!type) { - var ssType = classify.input(scriptSig, true); - var wsType = classify.witness(witnessStack, true); - if (ssType === SCRIPT_TYPES.NONSTANDARD) ssType = undefined; - if (wsType === SCRIPT_TYPES.NONSTANDARD) wsType = undefined; - type = ssType || wsType; - } - - switch (type) { - case SCRIPT_TYPES.P2WPKH: - { - var _payments$p2wpkh = payments.p2wpkh({ - witness: witnessStack - }), - output = _payments$p2wpkh.output, - pubkey = _payments$p2wpkh.pubkey, - signature = _payments$p2wpkh.signature; - - return { - prevOutScript: output, - prevOutType: SCRIPT_TYPES.P2WPKH, - pubkeys: [pubkey], - signatures: [signature] - }; - } - - case SCRIPT_TYPES.P2PKH: - { - var _payments$p2pkh = payments.p2pkh({ - input: scriptSig - }), - _output = _payments$p2pkh.output, - _pubkey = _payments$p2pkh.pubkey, - _signature = _payments$p2pkh.signature; - - return { - prevOutScript: _output, - prevOutType: SCRIPT_TYPES.P2PKH, - pubkeys: [_pubkey], - signatures: [_signature] - }; - } - - case SCRIPT_TYPES.P2PK: - { - var _payments$p2pk = payments.p2pk({ - input: scriptSig - }), - _signature2 = _payments$p2pk.signature; - - return { - prevOutType: SCRIPT_TYPES.P2PK, - pubkeys: [undefined], - signatures: [_signature2] - }; - } - - case SCRIPT_TYPES.P2MS: - { - var _payments$p2ms = payments.p2ms({ - input: scriptSig, - output: scriptPubKey - }, { - allowIncomplete: true - }), - m = _payments$p2ms.m, - pubkeys = _payments$p2ms.pubkeys, - signatures = _payments$p2ms.signatures; - - return { - prevOutType: SCRIPT_TYPES.P2MS, - pubkeys: pubkeys, - signatures: signatures, - maxSignatures: m - }; - } - } - - if (type === SCRIPT_TYPES.P2SH) { - var _payments$p2sh = payments.p2sh({ - input: scriptSig, - witness: witnessStack - }), - _output2 = _payments$p2sh.output, - redeem = _payments$p2sh.redeem; - - var outputType = classify.output(redeem.output); - var expanded = expandInput(redeem.input, redeem.witness, outputType, redeem.output); - if (!expanded.prevOutType) return {}; - return { - prevOutScript: _output2, - prevOutType: SCRIPT_TYPES.P2SH, - redeemScript: redeem.output, - redeemScriptType: expanded.prevOutType, - witnessScript: expanded.witnessScript, - witnessScriptType: expanded.witnessScriptType, - pubkeys: expanded.pubkeys, - signatures: expanded.signatures - }; - } - - if (type === SCRIPT_TYPES.P2WSH) { - var _payments$p2wsh = payments.p2wsh({ - input: scriptSig, - witness: witnessStack - }), - _output3 = _payments$p2wsh.output, - _redeem = _payments$p2wsh.redeem; - - var _outputType = classify.output(_redeem.output); - - var _expanded; - - if (_outputType === SCRIPT_TYPES.P2WPKH) { - _expanded = expandInput(_redeem.input, _redeem.witness, _outputType); - } else { - _expanded = expandInput(bscript.compile(_redeem.witness), [], _outputType, _redeem.output); - } - - if (!_expanded.prevOutType) return {}; - return { - prevOutScript: _output3, - prevOutType: SCRIPT_TYPES.P2WSH, - witnessScript: _redeem.output, - witnessScriptType: _expanded.prevOutType, - pubkeys: _expanded.pubkeys, - signatures: _expanded.signatures - }; - } - - return { - prevOutType: SCRIPT_TYPES.NONSTANDARD, - prevOutScript: scriptSig - }; -} // could be done in expandInput, but requires the original Transaction for hashForSignature - - -function fixMultisigOrder(input, transaction, vin) { - if (input.redeemScriptType !== SCRIPT_TYPES.P2MS || !input.redeemScript) return; - if (input.pubkeys.length === input.signatures.length) return; - var unmatched = input.signatures.concat(); - input.signatures = input.pubkeys.map(function (pubKey) { - var keyPair = ECPair.fromPublicKey(pubKey); - var match; // check for a signature - - unmatched.some(function (signature, i) { - // skip if undefined || OP_0 - if (!signature) return false; // TODO: avoid O(n) hashForSignature - - var parsed = bscript.signature.decode(signature); - var hash = transaction.hashForSignature(vin, input.redeemScript, parsed.hashType); // skip if signature does not match pubKey - - if (!keyPair.verify(hash, parsed.signature)) return false; // remove matched signature from unmatched - - unmatched[i] = undefined; - match = signature; - return true; - }); - return match; - }); -} - -function expandOutput(script, ourPubKey) { - typeforce(types.Buffer, script); - var type = classify.output(script); - - switch (type) { - case SCRIPT_TYPES.P2PKH: - { - if (!ourPubKey) return { - type: type - }; // does our hash160(pubKey) match the output scripts? - - var pkh1 = payments.p2pkh({ - output: script - }).hash; - var pkh2 = bcrypto.hash160(ourPubKey); - if (!pkh1.equals(pkh2)) return { - type: type - }; - return { - type: type, - pubkeys: [ourPubKey], - signatures: [undefined] - }; - } - - case SCRIPT_TYPES.P2WPKH: - { - if (!ourPubKey) return { - type: type - }; // does our hash160(pubKey) match the output scripts? - - var wpkh1 = payments.p2wpkh({ - output: script - }).hash; - var wpkh2 = bcrypto.hash160(ourPubKey); - if (!wpkh1.equals(wpkh2)) return { - type: type - }; - return { - type: type, - pubkeys: [ourPubKey], - signatures: [undefined] - }; - } - - case SCRIPT_TYPES.P2PK: - { - var p2pk = payments.p2pk({ - output: script - }); - return { - type: type, - pubkeys: [p2pk.pubkey], - signatures: [undefined] - }; - } - - case SCRIPT_TYPES.P2MS: - { - var p2ms = payments.p2ms({ - output: script - }); - return { - type: type, - pubkeys: p2ms.pubkeys, - signatures: p2ms.pubkeys.map(function () { - return undefined; - }), - maxSignatures: p2ms.m - }; - } - } - - return { - type: type - }; -} - -function prepareInput(input, ourPubKey, redeemScript, witnessScript) { - if (redeemScript && witnessScript) { - var p2wsh = payments.p2wsh({ - redeem: { - output: witnessScript - } - }); - var p2wshAlt = payments.p2wsh({ - output: redeemScript - }); - var p2sh = payments.p2sh({ - redeem: { - output: redeemScript - } - }); - var p2shAlt = payments.p2sh({ - redeem: p2wsh - }); // enforces P2SH(P2WSH(...)) - - if (!p2wsh.hash.equals(p2wshAlt.hash)) throw new Error('Witness script inconsistent with prevOutScript'); - if (!p2sh.hash.equals(p2shAlt.hash)) throw new Error('Redeem script inconsistent with prevOutScript'); - var expanded = expandOutput(p2wsh.redeem.output, ourPubKey); - if (!expanded.pubkeys) throw new Error(expanded.type + ' not supported as witnessScript (' + bscript.toASM(witnessScript) + ')'); - - if (input.signatures && input.signatures.some(function (x) { - return x !== undefined; - })) { - expanded.signatures = input.signatures; - } - - var signScript = witnessScript; - if (expanded.type === SCRIPT_TYPES.P2WPKH) throw new Error('P2SH(P2WSH(P2WPKH)) is a consensus failure'); - return { - redeemScript: redeemScript, - redeemScriptType: SCRIPT_TYPES.P2WSH, - witnessScript: witnessScript, - witnessScriptType: expanded.type, - prevOutType: SCRIPT_TYPES.P2SH, - prevOutScript: p2sh.output, - hasWitness: true, - signScript: signScript, - signType: expanded.type, - pubkeys: expanded.pubkeys, - signatures: expanded.signatures, - maxSignatures: expanded.maxSignatures - }; - } - - if (redeemScript) { - var _p2sh = payments.p2sh({ - redeem: { - output: redeemScript - } - }); - - if (input.prevOutScript) { - var _p2shAlt; - - try { - _p2shAlt = payments.p2sh({ - output: input.prevOutScript - }); - } catch (e) { - throw new Error('PrevOutScript must be P2SH'); - } - - if (!_p2sh.hash.equals(_p2shAlt.hash)) throw new Error('Redeem script inconsistent with prevOutScript'); - } - - var _expanded2 = expandOutput(_p2sh.redeem.output, ourPubKey); - - if (!_expanded2.pubkeys) throw new Error(_expanded2.type + ' not supported as redeemScript (' + bscript.toASM(redeemScript) + ')'); - - if (input.signatures && input.signatures.some(function (x) { - return x !== undefined; - })) { - _expanded2.signatures = input.signatures; - } - - var _signScript = redeemScript; - - if (_expanded2.type === SCRIPT_TYPES.P2WPKH) { - _signScript = payments.p2pkh({ - pubkey: _expanded2.pubkeys[0] - }).output; - } - - return { - redeemScript: redeemScript, - redeemScriptType: _expanded2.type, - prevOutType: SCRIPT_TYPES.P2SH, - prevOutScript: _p2sh.output, - hasWitness: _expanded2.type === SCRIPT_TYPES.P2WPKH, - signScript: _signScript, - signType: _expanded2.type, - pubkeys: _expanded2.pubkeys, - signatures: _expanded2.signatures, - maxSignatures: _expanded2.maxSignatures - }; - } - - if (witnessScript) { - var _p2wsh = payments.p2wsh({ - redeem: { - output: witnessScript - } - }); - - if (input.prevOutScript) { - var _p2wshAlt = payments.p2wsh({ - output: input.prevOutScript - }); - - if (!_p2wsh.hash.equals(_p2wshAlt.hash)) throw new Error('Witness script inconsistent with prevOutScript'); - } - - var _expanded3 = expandOutput(_p2wsh.redeem.output, ourPubKey); - - if (!_expanded3.pubkeys) throw new Error(_expanded3.type + ' not supported as witnessScript (' + bscript.toASM(witnessScript) + ')'); - - if (input.signatures && input.signatures.some(function (x) { - return x !== undefined; - })) { - _expanded3.signatures = input.signatures; - } - - var _signScript2 = witnessScript; - if (_expanded3.type === SCRIPT_TYPES.P2WPKH) throw new Error('P2WSH(P2WPKH) is a consensus failure'); - return { - witnessScript: witnessScript, - witnessScriptType: _expanded3.type, - prevOutType: SCRIPT_TYPES.P2WSH, - prevOutScript: _p2wsh.output, - hasWitness: true, - signScript: _signScript2, - signType: _expanded3.type, - pubkeys: _expanded3.pubkeys, - signatures: _expanded3.signatures, - maxSignatures: _expanded3.maxSignatures - }; - } - - if (input.prevOutType && input.prevOutScript) { - // embedded scripts are not possible without extra information - if (input.prevOutType === SCRIPT_TYPES.P2SH) throw new Error('PrevOutScript is ' + input.prevOutType + ', requires redeemScript'); - if (input.prevOutType === SCRIPT_TYPES.P2WSH) throw new Error('PrevOutScript is ' + input.prevOutType + ', requires witnessScript'); - if (!input.prevOutScript) throw new Error('PrevOutScript is missing'); - - var _expanded4 = expandOutput(input.prevOutScript, ourPubKey); - - if (!_expanded4.pubkeys) throw new Error(_expanded4.type + ' not supported (' + bscript.toASM(input.prevOutScript) + ')'); - - if (input.signatures && input.signatures.some(function (x) { - return x !== undefined; - })) { - _expanded4.signatures = input.signatures; - } - - var _signScript3 = input.prevOutScript; - - if (_expanded4.type === SCRIPT_TYPES.P2WPKH) { - _signScript3 = payments.p2pkh({ - pubkey: _expanded4.pubkeys[0] - }).output; - } - - return { - prevOutType: _expanded4.type, - prevOutScript: input.prevOutScript, - hasWitness: _expanded4.type === SCRIPT_TYPES.P2WPKH, - signScript: _signScript3, - signType: _expanded4.type, - pubkeys: _expanded4.pubkeys, - signatures: _expanded4.signatures, - maxSignatures: _expanded4.maxSignatures - }; - } - - var prevOutScript = payments.p2pkh({ - pubkey: ourPubKey - }).output; - return { - prevOutType: SCRIPT_TYPES.P2PKH, - prevOutScript: prevOutScript, - hasWitness: false, - signScript: prevOutScript, - signType: SCRIPT_TYPES.P2PKH, - pubkeys: [ourPubKey], - signatures: [undefined] - }; -} - -function build(type, input, allowIncomplete) { - var pubkeys = input.pubkeys || []; - var signatures = input.signatures || []; - - switch (type) { - case SCRIPT_TYPES.P2PKH: - { - if (pubkeys.length === 0) break; - if (signatures.length === 0) break; - return payments.p2pkh({ - pubkey: pubkeys[0], - signature: signatures[0] - }); - } - - case SCRIPT_TYPES.P2WPKH: - { - if (pubkeys.length === 0) break; - if (signatures.length === 0) break; - return payments.p2wpkh({ - pubkey: pubkeys[0], - signature: signatures[0] - }); - } - - case SCRIPT_TYPES.P2PK: - { - if (pubkeys.length === 0) break; - if (signatures.length === 0) break; - return payments.p2pk({ - signature: signatures[0] - }); - } - - case SCRIPT_TYPES.P2MS: - { - var m = input.maxSignatures; - - if (allowIncomplete) { - signatures = signatures.map(function (x) { - return x || script_1.OPS.OP_0; - }); - } else { - signatures = signatures.filter(function (x) { - return x; - }); - } // if the transaction is not not complete (complete), or if signatures.length === m, validate - // otherwise, the number of OP_0's may be >= m, so don't validate (boo) - - - var validate = !allowIncomplete || m === signatures.length; - return payments.p2ms({ - m: m, - pubkeys: pubkeys, - signatures: signatures - }, { - allowIncomplete: allowIncomplete, - validate: validate - }); - } - - case SCRIPT_TYPES.P2SH: - { - var redeem = build(input.redeemScriptType, input, allowIncomplete); - if (!redeem) return; - return payments.p2sh({ - redeem: { - output: redeem.output || input.redeemScript, - input: redeem.input, - witness: redeem.witness - } - }); - } - - case SCRIPT_TYPES.P2WSH: - { - var _redeem2 = build(input.witnessScriptType, input, allowIncomplete); - - if (!_redeem2) return; - return payments.p2wsh({ - redeem: { - output: input.witnessScript, - input: _redeem2.input, - witness: _redeem2.witness - } - }); - } - } -} - -function canSign(input) { - return input.signScript !== undefined && input.signType !== undefined && input.pubkeys !== undefined && input.signatures !== undefined && input.signatures.length === input.pubkeys.length && input.pubkeys.length > 0 && (input.hasWitness === false || input.value !== undefined); -} - -function signatureHashType(buffer) { - return buffer.readUInt8(buffer.length - 1); -} - -function checkSignArgs(inputs, signParams) { - if (!PREVOUT_TYPES.has(signParams.prevOutScriptType)) { - throw new TypeError("Unknown prevOutScriptType \"".concat(signParams.prevOutScriptType, "\"")); - } - - tfMessage(typeforce.Number, signParams.vin, "sign must include vin parameter as Number (input index)"); - tfMessage(types.Signer, signParams.keyPair, "sign must include keyPair parameter as Signer interface"); - tfMessage(typeforce.maybe(typeforce.Number), signParams.hashType, "sign hashType parameter must be a number"); - var prevOutType = (inputs[signParams.vin] || []).prevOutType; - var posType = signParams.prevOutScriptType; - - switch (posType) { - case 'p2pkh': - if (prevOutType && prevOutType !== 'pubkeyhash') { - throw new TypeError("input #".concat(signParams.vin, " is not of type p2pkh: ").concat(prevOutType)); - } - - tfMessage(typeforce.value(undefined), signParams.witnessScript, "".concat(posType, " requires NO witnessScript")); - tfMessage(typeforce.value(undefined), signParams.redeemScript, "".concat(posType, " requires NO redeemScript")); - tfMessage(typeforce.value(undefined), signParams.witnessValue, "".concat(posType, " requires NO witnessValue")); - break; - - case 'p2pk': - if (prevOutType && prevOutType !== 'pubkey') { - throw new TypeError("input #".concat(signParams.vin, " is not of type p2pk: ").concat(prevOutType)); - } - - tfMessage(typeforce.value(undefined), signParams.witnessScript, "".concat(posType, " requires NO witnessScript")); - tfMessage(typeforce.value(undefined), signParams.redeemScript, "".concat(posType, " requires NO redeemScript")); - tfMessage(typeforce.value(undefined), signParams.witnessValue, "".concat(posType, " requires NO witnessValue")); - break; - - case 'p2wpkh': - if (prevOutType && prevOutType !== 'witnesspubkeyhash') { - throw new TypeError("input #".concat(signParams.vin, " is not of type p2wpkh: ").concat(prevOutType)); - } - - tfMessage(typeforce.value(undefined), signParams.witnessScript, "".concat(posType, " requires NO witnessScript")); - tfMessage(typeforce.value(undefined), signParams.redeemScript, "".concat(posType, " requires NO redeemScript")); - tfMessage(types.Satoshi, signParams.witnessValue, "".concat(posType, " requires witnessValue")); - break; - - case 'p2ms': - if (prevOutType && prevOutType !== 'multisig') { - throw new TypeError("input #".concat(signParams.vin, " is not of type p2ms: ").concat(prevOutType)); - } - - tfMessage(typeforce.value(undefined), signParams.witnessScript, "".concat(posType, " requires NO witnessScript")); - tfMessage(typeforce.value(undefined), signParams.redeemScript, "".concat(posType, " requires NO redeemScript")); - tfMessage(typeforce.value(undefined), signParams.witnessValue, "".concat(posType, " requires NO witnessValue")); - break; - - case 'p2sh-p2wpkh': - if (prevOutType && prevOutType !== 'scripthash') { - throw new TypeError("input #".concat(signParams.vin, " is not of type p2sh-p2wpkh: ").concat(prevOutType)); - } - - tfMessage(typeforce.value(undefined), signParams.witnessScript, "".concat(posType, " requires NO witnessScript")); - tfMessage(typeforce.Buffer, signParams.redeemScript, "".concat(posType, " requires redeemScript")); - tfMessage(types.Satoshi, signParams.witnessValue, "".concat(posType, " requires witnessValue")); - break; - - case 'p2sh-p2ms': - case 'p2sh-p2pk': - case 'p2sh-p2pkh': - if (prevOutType && prevOutType !== 'scripthash') { - throw new TypeError("input #".concat(signParams.vin, " is not of type ").concat(posType, ": ").concat(prevOutType)); - } - - tfMessage(typeforce.value(undefined), signParams.witnessScript, "".concat(posType, " requires NO witnessScript")); - tfMessage(typeforce.Buffer, signParams.redeemScript, "".concat(posType, " requires redeemScript")); - tfMessage(typeforce.value(undefined), signParams.witnessValue, "".concat(posType, " requires NO witnessValue")); - break; - - case 'p2wsh-p2ms': - case 'p2wsh-p2pk': - case 'p2wsh-p2pkh': - if (prevOutType && prevOutType !== 'witnessscripthash') { - throw new TypeError("input #".concat(signParams.vin, " is not of type ").concat(posType, ": ").concat(prevOutType)); - } - - tfMessage(typeforce.Buffer, signParams.witnessScript, "".concat(posType, " requires witnessScript")); - tfMessage(typeforce.value(undefined), signParams.redeemScript, "".concat(posType, " requires NO redeemScript")); - tfMessage(types.Satoshi, signParams.witnessValue, "".concat(posType, " requires witnessValue")); - break; - - case 'p2sh-p2wsh-p2ms': - case 'p2sh-p2wsh-p2pk': - case 'p2sh-p2wsh-p2pkh': - if (prevOutType && prevOutType !== 'scripthash') { - throw new TypeError("input #".concat(signParams.vin, " is not of type ").concat(posType, ": ").concat(prevOutType)); - } - - tfMessage(typeforce.Buffer, signParams.witnessScript, "".concat(posType, " requires witnessScript")); - tfMessage(typeforce.Buffer, signParams.redeemScript, "".concat(posType, " requires witnessScript")); - tfMessage(types.Satoshi, signParams.witnessValue, "".concat(posType, " requires witnessScript")); - break; - } -} - -function trySign(_ref) { - var input = _ref.input, - ourPubKey = _ref.ourPubKey, - keyPair = _ref.keyPair, - signatureHash = _ref.signatureHash, - hashType = _ref.hashType, - useLowR = _ref.useLowR; - // enforce in order signing of public keys - var signed = false; - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = input.pubkeys.entries()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var _step$value = _slicedToArray(_step.value, 2), - i = _step$value[0], - pubKey = _step$value[1]; - - if (!ourPubKey.equals(pubKey)) continue; - if (input.signatures[i]) throw new Error('Signature already exists'); // TODO: add tests - - if (ourPubKey.length !== 33 && input.hasWitness) { - throw new Error('BIP143 rejects uncompressed public keys in P2WPKH or P2WSH'); - } - - var signature = keyPair.sign(signatureHash, useLowR); - input.signatures[i] = bscript.signature.encode(signature, hashType); - signed = true; - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return != null) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } - - if (!signed) throw new Error('Key pair cannot sign for this input'); -} - -function getSigningData(network, inputs, needsOutputs, tx, signParams, keyPair, redeemScript, hashType, witnessValue, witnessScript, useLowR) { - var vin; - - if (typeof signParams === 'number') { - console.warn('DEPRECATED: TransactionBuilder sign method arguments ' + 'will change in v6, please use the TxbSignArg interface'); - vin = signParams; - } else if (_typeof(signParams) === 'object') { - checkSignArgs(inputs, signParams); - vin = signParams.vin; - keyPair = signParams.keyPair; - redeemScript = signParams.redeemScript; - hashType = signParams.hashType; - witnessValue = signParams.witnessValue; - witnessScript = signParams.witnessScript; - } else { - throw new TypeError('TransactionBuilder sign first arg must be TxbSignArg or number'); - } - - if (keyPair === undefined) { - throw new Error('sign requires keypair'); - } // TODO: remove keyPair.network matching in 4.0.0 - - - if (keyPair.network && keyPair.network !== network) throw new TypeError('Inconsistent network'); - if (!inputs[vin]) throw new Error('No input at index: ' + vin); - hashType = hashType || transaction_1.Transaction.SIGHASH_ALL; - if (needsOutputs(hashType)) throw new Error('Transaction needs outputs'); - var input = inputs[vin]; // if redeemScript was previously provided, enforce consistency - - if (input.redeemScript !== undefined && redeemScript && !input.redeemScript.equals(redeemScript)) { - throw new Error('Inconsistent redeemScript'); - } - - var ourPubKey = keyPair.publicKey || keyPair.getPublicKey && keyPair.getPublicKey(); - - if (!canSign(input)) { - if (witnessValue !== undefined) { - if (input.value !== undefined && input.value !== witnessValue) throw new Error('Input did not match witnessValue'); - typeforce(types.Satoshi, witnessValue); - input.value = witnessValue; - } - - if (!canSign(input)) { - var prepared = prepareInput(input, ourPubKey, redeemScript, witnessScript); // updates inline - - Object.assign(input, prepared); - } - - if (!canSign(input)) throw Error(input.prevOutType + ' not supported'); - } // ready to sign - - - var signatureHash; - - if (input.hasWitness) { - signatureHash = tx.hashForWitnessV0(vin, input.signScript, input.value, hashType); - } else { - signatureHash = tx.hashForSignature(vin, input.signScript, hashType); - } - - return { - input: input, - ourPubKey: ourPubKey, - keyPair: keyPair, - signatureHash: signatureHash, - hashType: hashType, - useLowR: !!useLowR - }; -} -},{"./address":"wUUe","./bufferutils":"jFwl","./classify":"I041","./crypto":"uv3I","./ecpair":"ZFsm","./networks":"rvS6","./payments":"kEsd","./script":"Fa8t","./transaction":"Y9UO","./types":"TQ2w","typeforce":"PKU7","buffer":"dskh"}],"bZOe":[function(require,module,exports) { -'use strict'; - -Object.defineProperty(exports, '__esModule', { - value: true -}); - -var bip32 = require('bip32'); - -exports.bip32 = bip32; - -var address = require('./address'); - -exports.address = address; - -var crypto = require('./crypto'); - -exports.crypto = crypto; - -var ECPair = require('./ecpair'); - -exports.ECPair = ECPair; - -var networks = require('./networks'); - -exports.networks = networks; - -var payments = require('./payments'); - -exports.payments = payments; - -var script = require('./script'); - -exports.script = script; - -var block_1 = require('./block'); - -exports.Block = block_1.Block; - -var psbt_1 = require('./psbt'); - -exports.Psbt = psbt_1.Psbt; - -var script_1 = require('./script'); - -exports.opcodes = script_1.OPS; - -var transaction_1 = require('./transaction'); - -exports.Transaction = transaction_1.Transaction; - -var transaction_builder_1 = require('./transaction_builder'); - -exports.TransactionBuilder = transaction_builder_1.TransactionBuilder; -},{"bip32":"pelw","./address":"wUUe","./crypto":"uv3I","./ecpair":"ZFsm","./networks":"rvS6","./payments":"kEsd","./script":"Fa8t","./block":"lHho","./psbt":"CbJH","./transaction":"Y9UO","./transaction_builder":"k6oC"}],"d9Yf":[function(require,module,exports) { -/*! -Copyright (C) 2015 by Andrea Giammarchi - @WebReflection - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -*/ -var cloner = (function (O) {'use strict'; - - // (C) Andrea Giammarchi - Mit Style - - var - - // constants - VALUE = 'value', - PROTO = '__proto__', // to avoid jshint complains - - // shortcuts - isArray = Array.isArray, - create = O.create, - dP = O.defineProperty, - dPs = O.defineProperties, - gOPD = O.getOwnPropertyDescriptor, - gOPN = O.getOwnPropertyNames, - gOPS = O.getOwnPropertySymbols || - function (o) { return Array.prototype; }, - gPO = O.getPrototypeOf || - function (o) { return o[PROTO]; }, - hOP = O.prototype.hasOwnProperty, - oKs = (typeof Reflect !== typeof oK) && - Reflect.ownKeys || - function (o) { return gOPS(o).concat(gOPN(o)); }, - set = function (descriptors, key, descriptor) { - if (key in descriptors) dP(descriptors, key, { - configurable: true, - enumerable: true, - value: descriptor - }); - else descriptors[key] = descriptor; - }, - - // used to avoid recursions in deep copy - index = -1, - known = null, - blown = null, - clean = function () { known = blown = null; }, - - // utilities - New = function (source, descriptors) { - var out = isArray(source) ? [] : create(gPO(source)); - return descriptors ? Object.defineProperties(out, descriptors) : out; - }, - - // deep copy and merge - deepCopy = function deepCopy(source) { - var result = New(source); - known = [source]; - blown = [result]; - deepDefine(result, source); - clean(); - return result; - }, - deepMerge = function (target) { - known = []; - blown = []; - for (var i = 1; i < arguments.length; i++) { - known[i - 1] = arguments[i]; - blown[i - 1] = target; - } - merge.apply(true, arguments); - clean(); - return target; - }, - - // shallow copy and merge - shallowCopy = function shallowCopy(source) { - clean(); - for (var - key, - descriptors = {}, - keys = oKs(source), - i = keys.length; i--; - set(descriptors, key, gOPD(source, key)) - ) key = keys[i]; - return New(source, descriptors); - }, - shallowMerge = function () { - clean(); - return merge.apply(false, arguments); - }, - - // internal methods - isObject = function isObject(value) { - /*jshint eqnull: true */ - return value != null && typeof value === 'object'; - }, - shouldCopy = function shouldCopy(value) { - /*jshint eqnull: true */ - index = -1; - if (isObject(value)) { - if (known == null) return true; - index = known.indexOf(value); - if (index < 0) return 0 < known.push(value); - } - return false; - }, - deepDefine = function deepDefine(target, source) { - for (var - key, descriptor, - descriptors = {}, - keys = oKs(source), - i = keys.length; i--; - ) { - key = keys[i]; - descriptor = gOPD(source, key); - if (VALUE in descriptor) deepValue(descriptor); - set(descriptors, key, descriptor); - } - dPs(target, descriptors); - }, - deepValue = function deepValue(descriptor) { - var value = descriptor[VALUE]; - if (shouldCopy(value)) { - descriptor[VALUE] = New(value); - deepDefine(descriptor[VALUE], value); - blown[known.indexOf(value)] = descriptor[VALUE]; - } else if (-1 < index && index in blown) { - descriptor[VALUE] = blown[index]; - } - }, - merge = function merge(target) { - for (var - source, - keys, key, - value, tvalue, - descriptor, - deep = this.valueOf(), - descriptors = {}, - i, a = 1; - a < arguments.length; a++ - ) { - source = arguments[a]; - keys = oKs(source); - for (i = 0; i < keys.length; i++) { - key = keys[i]; - descriptor = gOPD(source, key); - if (hOP.call(target, key)) { - if (VALUE in descriptor) { - value = descriptor[VALUE]; - if (shouldCopy(value)) { - descriptor = gOPD(target, key); - if (VALUE in descriptor) { - tvalue = descriptor[VALUE]; - if (isObject(tvalue)) { - merge.call(deep, tvalue, value); - } - } - } - } - } else { - if (deep && VALUE in descriptor) { - deepValue(descriptor); - } - set(descriptors, key, descriptor); - } - } - } - return dPs(target, descriptors); - } - ; - - return { - deep: { - copy: deepCopy, - merge: deepMerge - }, - shallow: { - copy: shallowCopy, - merge: shallowMerge - } - }; - -}(Object)); -module.exports = cloner; -},{}],"DXq1":[function(require,module,exports) { -var __filename = "/Users/Sanchay/Work/js-sdk/src/packages/utils.ts"; -var Buffer = require("buffer").Buffer; -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.cloneValue = exports.getRandomHexString = exports.getKeyPairFromPrivKey = exports.cachedFunctionCall = exports.sanitizePrivKey = exports.httpJSONRequest = void 0; - -var bitcoin = _interopRequireWildcard(require("bitcoinjs-lib")); - -var cloner = _interopRequireWildcard(require("cloner")); - -var _error = require("./error"); - -var _logger = require("./logger"); - -function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; if (obj != null) { var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } - -var __awaiter = void 0 && (void 0).__awaiter || function (thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function (resolve) { - resolve(value); - }); - } - - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; - -var __generator = void 0 && (void 0).__generator || function (thisArg, body) { - var _ = { - label: 0, - sent: function sent() { - if (t[0] & 1) throw t[1]; - return t[1]; - }, - trys: [], - ops: [] - }, - f, - y, - t, - g; - return g = { - next: verb(0), - "throw": verb(1), - "return": verb(2) - }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { - return this; - }), g; - - function verb(n) { - return function (v) { - return step([n, v]); - }; - } - - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - - while (_) { - try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - - switch (op[0]) { - case 0: - case 1: - t = op; - break; - - case 4: - _.label++; - return { - value: op[1], - done: false - }; - - case 5: - _.label++; - y = op[1]; - op = [0]; - continue; - - case 7: - op = _.ops.pop(); - - _.trys.pop(); - - continue; - - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { - _ = 0; - continue; - } - - if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) { - _.label = op[1]; - break; - } - - if (op[0] === 6 && _.label < t[1]) { - _.label = t[1]; - t = op; - break; - } - - if (t && _.label < t[2]) { - _.label = t[2]; - - _.ops.push(op); - - break; - } - - if (t[2]) _.ops.pop(); - - _.trys.pop(); - - continue; - } - - op = body.call(thisArg, _); - } catch (e) { - op = [6, e]; - y = 0; - } finally { - f = t = 0; - } - } - - if (op[0] & 5) throw op[1]; - return { - value: op[0] ? op[1] : void 0, - done: true - }; - } -}; - -var log = (0, _logger.getLogger)(__filename); -var httpsPrefixRegex = new RegExp("^https://.+$"); -/* istanbul ignore next */ - -var httpJSONRequest = function httpJSONRequest(options) { - log.debug("network_call:", options); - var promise = new Promise(function (resolve, reject) { - var _a = translateRequestOptionsToFetchOptions(options), - url = _a.url, - fetchOptions = _a.fetchOptions; - - if (!httpsPrefixRegex.test(url)) { - throw _error.ErrorHelper.getPackageError(null, _error.PackageErrorCode.InsecureNetworkCall); - } - - fetch(url, fetchOptions).then(function (res) { - return res.json(); - }).then(function (json) { - return resolve(json); - }).catch(function (err) { - return reject(new _error.BaseError(null, err)); - }); - }); - return promise; -}; - -exports.httpJSONRequest = httpJSONRequest; - -var translateRequestOptionsToFetchOptions = function translateRequestOptionsToFetchOptions(options) { - var fetchOptions = Object.assign({}, options); - delete fetchOptions.baseUrl; - delete fetchOptions.url; - var url = ""; - - if (options.baseUrl) { - url += options.baseUrl; - } - - if (options.url) { - url += options.url; - } - - if (options.qs) { - var str = []; - - for (var p in options.qs) { - if (options.qs.hasOwnProperty(p)) { - str.push(p + "=" + options.qs[p]); - } - } - - url += "?" + str.join("&"); - } - - if (options.body) { - fetchOptions.body = JSON.stringify(options.body); - } - - return { - url: url, - fetchOptions: fetchOptions - }; -}; - -var sanitizePrivKey = function sanitizePrivKey(privKey) { - if (privKey.length === 66 && privKey.slice(64) === "01") { - privKey = privKey.slice(0, 64); - } - - return privKey; -}; - -exports.sanitizePrivKey = sanitizePrivKey; - -var getRandomHexString = function getRandomHexString(length) { - if (length === void 0) { - length = 32; - } - - var randomValues = crypto.getRandomValues(new Uint8Array(length)); - var result = ""; - var i; - - for (i = 0; i < randomValues.length; i++) { - result = result + randomValues[i].toString(16).toUpperCase(); - } - - return result; -}; - -exports.getRandomHexString = getRandomHexString; - -var cachedFunctionCall = function cachedFunctionCall(storage, cacheKey, ttl, fn, paramArray, skipConditional) { - if (ttl === void 0) { - ttl = 300; - } - - return __awaiter(void 0, void 0, Promise, function () { - var storageCacheKey, cachedValue, cachedExpiry, _a, newValue, skipCache, _b, stringValue; - - return __generator(this, function (_c) { - switch (_c.label) { - case 0: - if (!storage) { - log.info("cacheStorage is missing, making a direct call"); - return [2 - /*return*/ - , fn.apply(fn, paramArray)]; - } - - storageCacheKey = "crux_cache_" + cacheKey; - return [4 - /*yield*/ - , storage.getItem(storageCacheKey)]; - - case 1: - cachedValue = _c.sent(); - _a = Number; - return [4 - /*yield*/ - , storage.getItem(storageCacheKey + ":exp")]; - - case 2: - cachedExpiry = _a.apply(void 0, [_c.sent()]); - - if (cachedValue && cachedExpiry && new Date(cachedExpiry) > new Date()) { - log.debug("using cachedValue from storage for key " + storageCacheKey); - - try { - return [2 - /*return*/ - , JSON.parse(cachedValue)]; - } catch (error) { - return [2 - /*return*/ - , cachedValue]; - } - } - - return [4 - /*yield*/ - , fn.apply(fn, paramArray)]; - - case 3: - newValue = _c.sent(); - _b = skipConditional; - if (!_b) return [3 - /*break*/ - , 5]; - return [4 - /*yield*/ - , skipConditional(newValue)]; - - case 4: - _b = _c.sent(); - _c.label = 5; - - case 5: - skipCache = _b || false; - if (!(newValue && !skipCache)) return [3 - /*break*/ - , 8]; - stringValue = typeof newValue === "string" ? newValue : JSON.stringify(newValue); - return [4 - /*yield*/ - , storage.setItem(storageCacheKey, stringValue)]; - - case 6: - _c.sent(); - - return [4 - /*yield*/ - , storage.setItem(storageCacheKey + ":exp", (ttl * 1000 + Date.now()).toString())]; - - case 7: - _c.sent(); - - _c.label = 8; - - case 8: - return [2 - /*return*/ - , newValue]; - } - }); - }); -}; - -exports.cachedFunctionCall = cachedFunctionCall; - -var cloneValue = function cloneValue(obj) { - return cloner.deep.copy(obj); -}; - -exports.cloneValue = cloneValue; - -var getKeyPairFromPrivKey = function getKeyPairFromPrivKey(privKey) { - var privateKey; // Convert the WIF format to hex - - if (privKey.startsWith("L") || privKey.startsWith("K")) { - var keyPair = bitcoin.ECPair.fromWIF(privKey); - - if (keyPair.privateKey) { - privateKey = sanitizePrivKey(keyPair.privateKey.toString("hex")); - } else { - throw new _error.BaseError(null, "Missing private key in generated EC Pair"); - } - } else { - privateKey = sanitizePrivKey(privKey); - } // Try with hex encoding first, then with base64 - - - var publicKey; - - try { - publicKey = bitcoin.ECPair.fromPrivateKey(Buffer.from(privateKey, "hex")).publicKey.toString("hex"); - } catch (error) { - privateKey = sanitizePrivKey(Buffer.from(privKey, "base64").toString("hex")); - - try { - publicKey = bitcoin.ECPair.fromPrivateKey(Buffer.from(privateKey, "hex")).publicKey.toString("hex"); - } catch (error) { - throw _error.ErrorHelper.getPackageError(error, _error.PackageErrorCode.InvalidPrivateKeyFormat); - } - } - - var address = bitcoin.payments.p2pkh({ - pubkey: Buffer.from(publicKey, "hex") - }).address; - - if (!address) { - throw new _error.BaseError(null, "No address found corresponding this public key"); - } - - return { - address: address, - privKey: privateKey, - pubKey: publicKey - }; -}; - -exports.getKeyPairFromPrivKey = getKeyPairFromPrivKey; -},{"bitcoinjs-lib":"bZOe","cloner":"d9Yf","./error":"yXIU","./logger":"eThb","buffer":"dskh"}],"oAJn":[function(require,module,exports) { -var __filename = "/Users/Sanchay/Work/js-sdk/src/infrastructure/implementations/basic-key-manager.ts"; -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.BasicKeyManager = void 0; - -var _jsontokens = require("jsontokens"); - -var _encryption = require("../../packages/encryption"); - -var _logger = require("../../packages/logger"); - -var _utils = require("../../packages/utils"); - -var __awaiter = void 0 && (void 0).__awaiter || function (thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function (resolve) { - resolve(value); - }); - } - - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; - -var __generator = void 0 && (void 0).__generator || function (thisArg, body) { - var _ = { - label: 0, - sent: function sent() { - if (t[0] & 1) throw t[1]; - return t[1]; - }, - trys: [], - ops: [] - }, - f, - y, - t, - g; - return g = { - next: verb(0), - "throw": verb(1), - "return": verb(2) - }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { - return this; - }), g; - - function verb(n) { - return function (v) { - return step([n, v]); - }; - } - - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - - while (_) { - try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - - switch (op[0]) { - case 0: - case 1: - t = op; - break; - - case 4: - _.label++; - return { - value: op[1], - done: false - }; - - case 5: - _.label++; - y = op[1]; - op = [0]; - continue; - - case 7: - op = _.ops.pop(); - - _.trys.pop(); - - continue; - - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { - _ = 0; - continue; - } - - if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) { - _.label = op[1]; - break; - } - - if (op[0] === 6 && _.label < t[1]) { - _.label = t[1]; - t = op; - break; - } - - if (t && _.label < t[2]) { - _.label = t[2]; - - _.ops.push(op); - - break; - } - - if (t[2]) _.ops.pop(); - - _.trys.pop(); - - continue; - } - - op = body.call(thisArg, _); - } catch (e) { - op = [6, e]; - y = 0; - } finally { - f = t = 0; - } - } - - if (op[0] & 5) throw op[1]; - return { - value: op[0] ? op[1] : void 0, - done: true - }; - } -}; - -var log = (0, _logger.getLogger)(__filename); - -var BasicKeyManager = -/** @class */ -function () { - function BasicKeyManager(privateKey, getEncryptionKey) { - var _this = this; - - this.signWebToken = function (payload) { - return __awaiter(_this, void 0, Promise, function () { - var privateKey, signedMsg; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - return [4 - /*yield*/ - , this.initPromise]; - - case 1: - _a.sent(); - - return [4 - /*yield*/ - , this.getDecryptedPrivateKey()]; - - case 2: - privateKey = _a.sent(); - signedMsg = new _jsontokens.TokenSigner("ES256K", privateKey).sign(payload); - privateKey = "0".repeat(privateKey.length); - return [2 - /*return*/ - , signedMsg]; - } - }); - }); - }; - - this.getPubKey = function () { - return __awaiter(_this, void 0, Promise, function () { - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - return [4 - /*yield*/ - , this.initPromise]; - - case 1: - _a.sent(); - - return [2 - /*return*/ - , this.publicKey]; - } - }); - }); - }; - - this.init = function (privateKey, getEncryptionKey) { - return __awaiter(_this, void 0, Promise, function () { - var encryptionConstant, keyPair, _a, _b, _c; - - return __generator(this, function (_d) { - switch (_d.label) { - case 0: - if (!getEncryptionKey) return [3 - /*break*/ - , 2]; - return [4 - /*yield*/ - , getEncryptionKey()]; - - case 1: - encryptionConstant = _d.sent(); - this.getEncryptionKey = getEncryptionKey; - return [3 - /*break*/ - , 3]; - - case 2: - encryptionConstant = (0, _utils.getRandomHexString)(); - this.ephemeralEncryptionConstant = encryptionConstant; - _d.label = 3; - - case 3: - keyPair = (0, _utils.getKeyPairFromPrivKey)(privateKey); - this.publicKey = keyPair.pubKey; - _a = this; - _c = (_b = JSON).stringify; - return [4 - /*yield*/ - , _encryption.Encryption.encryptText(keyPair.privKey, encryptionConstant)]; - - case 4: - _a.encryptedPrivateKey = _c.apply(_b, [_d.sent()]); - privateKey = "0".repeat(privateKey.length); - return [2 - /*return*/ - ]; - } - }); - }); - }; - - this.getDecryptedPrivateKey = function () { - return __awaiter(_this, void 0, Promise, function () { - var encryptionConstant, encryptedPrivateKeyObject; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - return [4 - /*yield*/ - , this.initPromise]; - - case 1: - _a.sent(); - - if (!this.getEncryptionKey) return [3 - /*break*/ - , 3]; - return [4 - /*yield*/ - , this.getEncryptionKey()]; - - case 2: - encryptionConstant = _a.sent(); - return [3 - /*break*/ - , 4]; - - case 3: - // assume that there is ephemeralEncryptionConstant set as fallback - encryptionConstant = this.ephemeralEncryptionConstant; - _a.label = 4; - - case 4: - encryptedPrivateKeyObject = JSON.parse(this.encryptedPrivateKey); - return [2 - /*return*/ - , _encryption.Encryption.decryptText(encryptedPrivateKeyObject.encBuffer, encryptedPrivateKeyObject.iv, encryptionConstant)]; - } - }); - }); - }; - - this.initPromise = this.init(privateKey, getEncryptionKey); - log.debug("BasicKeyManager initialised"); - } - - return BasicKeyManager; -}(); - -exports.BasicKeyManager = BasicKeyManager; -},{"jsontokens":"ap7v","../../packages/encryption":"m5br","../../packages/logger":"eThb","../../packages/utils":"DXq1"}],"HdiE":[function(require,module,exports) { -var __filename = "/Users/Sanchay/Work/js-sdk/src/core/entities/crux-domain.ts"; -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.CruxDomain = exports.DomainRegistrationStatus = void 0; - -var _error = require("../../packages/error"); - -var _logger = require("../../packages/logger"); - -var _cruxSpec = require("./crux-spec"); - -var log = (0, _logger.getLogger)(__filename); -var DomainRegistrationStatus; -exports.DomainRegistrationStatus = DomainRegistrationStatus; - -(function (DomainRegistrationStatus) { - DomainRegistrationStatus["AVAILABLE"] = "AVAILABLE"; - DomainRegistrationStatus["REGISTERED"] = "REGISTERED"; - DomainRegistrationStatus["REVOKED"] = "REVOKED"; -})(DomainRegistrationStatus || (exports.DomainRegistrationStatus = DomainRegistrationStatus = {})); - -var CruxDomain = -/** @class */ -function () { - function CruxDomain(cruxDomainId, registrationStatus, domainConfig) { - var _this = this; - - this.setRegistrationStatus = function (registrationStatus) { - // validate and set the registrationStatus - if (!(registrationStatus in DomainRegistrationStatus)) { - throw new _error.BaseError(null, "Domain registration status validation failed!"); - } - - _this.registrationStatus = registrationStatus; - }; - - this.setConfig = function (domainConfig) { - if (!domainConfig.assetList) { - throw new _error.BaseError(null, "assetList required in domainConfig"); - } - - if (!domainConfig.assetMapping) { - throw new _error.BaseError(null, "assetMapping required in domainConfig"); - } // validate and set the config - - - try { - _cruxSpec.CruxSpec.validations.validateAssetList(domainConfig.assetList); - - _cruxSpec.CruxSpec.validations.validateAssetMapping(domainConfig.assetMapping, domainConfig.assetList); - - if (domainConfig.nameserviceConfiguration) { - _cruxSpec.CruxSpec.validations.validateNameServiceConfig(domainConfig.nameserviceConfiguration); - } - } catch (e) { - throw new _error.BaseError(e, "Domain config validation failed!"); - } - - _this.domainConfig = domainConfig; - }; - - this.domainId = cruxDomainId; - this.setRegistrationStatus(registrationStatus); - this.setConfig(domainConfig); - log.debug("CruxDomain initialised"); - } - - Object.defineProperty(CruxDomain.prototype, "id", { - get: function get() { - return this.domainId; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(CruxDomain.prototype, "status", { - get: function get() { - return this.registrationStatus; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(CruxDomain.prototype, "config", { - get: function get() { - return this.domainConfig; - }, - set: function set(domainConfig) { - this.setConfig(domainConfig); - }, - enumerable: true, - configurable: true - }); - return CruxDomain; -}(); - -exports.CruxDomain = CruxDomain; -},{"../../packages/error":"yXIU","../../packages/logger":"eThb","./crux-spec":"Zk7e"}],"J4Nk":[function(require,module,exports) { -/* -object-assign -(c) Sindre Sorhus -@license MIT -*/ -'use strict'; -/* eslint-disable no-unused-vars */ - -var getOwnPropertySymbols = Object.getOwnPropertySymbols; -var hasOwnProperty = Object.prototype.hasOwnProperty; -var propIsEnumerable = Object.prototype.propertyIsEnumerable; - -function toObject(val) { - if (val === null || val === undefined) { - throw new TypeError('Object.assign cannot be called with null or undefined'); - } - - return Object(val); -} - -function shouldUseNative() { - try { - if (!Object.assign) { - return false; - } // Detect buggy property enumeration order in older V8 versions. - // https://bugs.chromium.org/p/v8/issues/detail?id=4118 - - - var test1 = new String('abc'); // eslint-disable-line no-new-wrappers - - test1[5] = 'de'; - - if (Object.getOwnPropertyNames(test1)[0] === '5') { - return false; - } // https://bugs.chromium.org/p/v8/issues/detail?id=3056 - - - var test2 = {}; - - for (var i = 0; i < 10; i++) { - test2['_' + String.fromCharCode(i)] = i; - } - - var order2 = Object.getOwnPropertyNames(test2).map(function (n) { - return test2[n]; - }); - - if (order2.join('') !== '0123456789') { - return false; - } // https://bugs.chromium.org/p/v8/issues/detail?id=3056 - - - var test3 = {}; - 'abcdefghijklmnopqrst'.split('').forEach(function (letter) { - test3[letter] = letter; - }); - - if (Object.keys(Object.assign({}, test3)).join('') !== 'abcdefghijklmnopqrst') { - return false; - } - - return true; - } catch (err) { - // We don't expect any of the above to throw, but better to be safe. - return false; - } -} - -module.exports = shouldUseNative() ? Object.assign : function (target, source) { - var from; - var to = toObject(target); - var symbols; - - for (var s = 1; s < arguments.length; s++) { - from = Object(arguments[s]); - - for (var key in from) { - if (hasOwnProperty.call(from, key)) { - to[key] = from[key]; - } - } - - if (getOwnPropertySymbols) { - symbols = getOwnPropertySymbols(from); - - for (var i = 0; i < symbols.length; i++) { - if (propIsEnumerable.call(from, symbols[i])) { - to[symbols[i]] = from[symbols[i]]; - } - } - } - } - - return to; -}; -},{}],"rd3l":[function(require,module,exports) { -module.exports = function isBuffer(arg) { - return arg && typeof arg === 'object' - && typeof arg.copy === 'function' - && typeof arg.fill === 'function' - && typeof arg.readUInt8 === 'function'; -} -},{}],"fCKU":[function(require,module,exports) { -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); - }; -} else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor - } -} - -},{}],"XOAc":[function(require,module,exports) { -var global = arguments[3]; -var process = require("process"); -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. -var formatRegExp = /%[sdj%]/g; - -exports.format = function (f) { - if (!isString(f)) { - var objects = []; - - for (var i = 0; i < arguments.length; i++) { - objects.push(inspect(arguments[i])); - } - - return objects.join(' '); - } - - var i = 1; - var args = arguments; - var len = args.length; - var str = String(f).replace(formatRegExp, function (x) { - if (x === '%%') return '%'; - if (i >= len) return x; - - switch (x) { - case '%s': - return String(args[i++]); - - case '%d': - return Number(args[i++]); - - case '%j': - try { - return JSON.stringify(args[i++]); - } catch (_) { - return '[Circular]'; - } - - default: - return x; - } - }); - - for (var x = args[i]; i < len; x = args[++i]) { - if (isNull(x) || !isObject(x)) { - str += ' ' + x; - } else { - str += ' ' + inspect(x); - } - } - - return str; -}; // Mark that a method should not be used. -// Returns a modified function which warns once by default. -// If --no-deprecation is set, then it is a no-op. - - -exports.deprecate = function (fn, msg) { - // Allow for deprecating things in the process of starting up. - if (isUndefined(global.process)) { - return function () { - return exports.deprecate(fn, msg).apply(this, arguments); - }; - } - - if (process.noDeprecation === true) { - return fn; - } - - var warned = false; - - function deprecated() { - if (!warned) { - if (process.throwDeprecation) { - throw new Error(msg); - } else if (process.traceDeprecation) { - console.trace(msg); - } else { - console.error(msg); - } - - warned = true; - } - - return fn.apply(this, arguments); - } - - return deprecated; -}; - -var debugs = {}; -var debugEnviron; - -exports.debuglog = function (set) { - if (isUndefined(debugEnviron)) debugEnviron = undefined || ''; - set = set.toUpperCase(); - - if (!debugs[set]) { - if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { - var pid = process.pid; - - debugs[set] = function () { - var msg = exports.format.apply(exports, arguments); - console.error('%s %d: %s', set, pid, msg); - }; - } else { - debugs[set] = function () {}; - } - } - - return debugs[set]; -}; -/** - * Echos the value of a value. Trys to print the value out - * in the best way possible given the different types. - * - * @param {Object} obj The object to print out. - * @param {Object} opts Optional options object that alters the output. - */ - -/* legacy: obj, showHidden, depth, colors*/ - - -function inspect(obj, opts) { - // default options - var ctx = { - seen: [], - stylize: stylizeNoColor - }; // legacy... - - if (arguments.length >= 3) ctx.depth = arguments[2]; - if (arguments.length >= 4) ctx.colors = arguments[3]; - - if (isBoolean(opts)) { - // legacy... - ctx.showHidden = opts; - } else if (opts) { - // got an "options" object - exports._extend(ctx, opts); - } // set default options - - - if (isUndefined(ctx.showHidden)) ctx.showHidden = false; - if (isUndefined(ctx.depth)) ctx.depth = 2; - if (isUndefined(ctx.colors)) ctx.colors = false; - if (isUndefined(ctx.customInspect)) ctx.customInspect = true; - if (ctx.colors) ctx.stylize = stylizeWithColor; - return formatValue(ctx, obj, ctx.depth); -} - -exports.inspect = inspect; // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics - -inspect.colors = { - 'bold': [1, 22], - 'italic': [3, 23], - 'underline': [4, 24], - 'inverse': [7, 27], - 'white': [37, 39], - 'grey': [90, 39], - 'black': [30, 39], - 'blue': [34, 39], - 'cyan': [36, 39], - 'green': [32, 39], - 'magenta': [35, 39], - 'red': [31, 39], - 'yellow': [33, 39] -}; // Don't use 'blue' not visible on cmd.exe - -inspect.styles = { - 'special': 'cyan', - 'number': 'yellow', - 'boolean': 'yellow', - 'undefined': 'grey', - 'null': 'bold', - 'string': 'green', - 'date': 'magenta', - // "name": intentionally not styling - 'regexp': 'red' -}; - -function stylizeWithColor(str, styleType) { - var style = inspect.styles[styleType]; - - if (style) { - return '\u001b[' + inspect.colors[style][0] + 'm' + str + '\u001b[' + inspect.colors[style][1] + 'm'; - } else { - return str; - } -} - -function stylizeNoColor(str, styleType) { - return str; -} - -function arrayToHash(array) { - var hash = {}; - array.forEach(function (val, idx) { - hash[val] = true; - }); - return hash; -} - -function formatValue(ctx, value, recurseTimes) { - // Provide a hook for user-specified inspect functions. - // Check that value is an object with an inspect function on it - if (ctx.customInspect && value && isFunction(value.inspect) && // Filter out the util module, it's inspect function is special - value.inspect !== exports.inspect && // Also filter out any prototype objects using the circular check. - !(value.constructor && value.constructor.prototype === value)) { - var ret = value.inspect(recurseTimes, ctx); - - if (!isString(ret)) { - ret = formatValue(ctx, ret, recurseTimes); - } - - return ret; - } // Primitive types cannot have properties - - - var primitive = formatPrimitive(ctx, value); - - if (primitive) { - return primitive; - } // Look up the keys of the object. - - - var keys = Object.keys(value); - var visibleKeys = arrayToHash(keys); - - if (ctx.showHidden) { - keys = Object.getOwnPropertyNames(value); - } // IE doesn't make error fields non-enumerable - // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx - - - if (isError(value) && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { - return formatError(value); - } // Some type of object without properties can be shortcutted. - - - if (keys.length === 0) { - if (isFunction(value)) { - var name = value.name ? ': ' + value.name : ''; - return ctx.stylize('[Function' + name + ']', 'special'); - } - - if (isRegExp(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); - } - - if (isDate(value)) { - return ctx.stylize(Date.prototype.toString.call(value), 'date'); - } - - if (isError(value)) { - return formatError(value); - } - } - - var base = '', - array = false, - braces = ['{', '}']; // Make Array say that they are Array - - if (isArray(value)) { - array = true; - braces = ['[', ']']; - } // Make functions say that they are functions - - - if (isFunction(value)) { - var n = value.name ? ': ' + value.name : ''; - base = ' [Function' + n + ']'; - } // Make RegExps say that they are RegExps - - - if (isRegExp(value)) { - base = ' ' + RegExp.prototype.toString.call(value); - } // Make dates with properties first say the date - - - if (isDate(value)) { - base = ' ' + Date.prototype.toUTCString.call(value); - } // Make error with message first say the error - - - if (isError(value)) { - base = ' ' + formatError(value); - } - - if (keys.length === 0 && (!array || value.length == 0)) { - return braces[0] + base + braces[1]; - } - - if (recurseTimes < 0) { - if (isRegExp(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); - } else { - return ctx.stylize('[Object]', 'special'); - } - } - - ctx.seen.push(value); - var output; - - if (array) { - output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); - } else { - output = keys.map(function (key) { - return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); - }); - } - - ctx.seen.pop(); - return reduceToSingleString(output, base, braces); -} - -function formatPrimitive(ctx, value) { - if (isUndefined(value)) return ctx.stylize('undefined', 'undefined'); - - if (isString(value)) { - var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '').replace(/'/g, "\\'").replace(/\\"/g, '"') + '\''; - return ctx.stylize(simple, 'string'); - } - - if (isNumber(value)) return ctx.stylize('' + value, 'number'); - if (isBoolean(value)) return ctx.stylize('' + value, 'boolean'); // For some reason typeof null is "object", so special case here. - - if (isNull(value)) return ctx.stylize('null', 'null'); -} - -function formatError(value) { - return '[' + Error.prototype.toString.call(value) + ']'; -} - -function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { - var output = []; - - for (var i = 0, l = value.length; i < l; ++i) { - if (hasOwnProperty(value, String(i))) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, String(i), true)); - } else { - output.push(''); - } - } - - keys.forEach(function (key) { - if (!key.match(/^\d+$/)) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, key, true)); - } - }); - return output; -} - -function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { - var name, str, desc; - desc = Object.getOwnPropertyDescriptor(value, key) || { - value: value[key] - }; - - if (desc.get) { - if (desc.set) { - str = ctx.stylize('[Getter/Setter]', 'special'); - } else { - str = ctx.stylize('[Getter]', 'special'); - } - } else { - if (desc.set) { - str = ctx.stylize('[Setter]', 'special'); - } - } - - if (!hasOwnProperty(visibleKeys, key)) { - name = '[' + key + ']'; - } - - if (!str) { - if (ctx.seen.indexOf(desc.value) < 0) { - if (isNull(recurseTimes)) { - str = formatValue(ctx, desc.value, null); - } else { - str = formatValue(ctx, desc.value, recurseTimes - 1); - } - - if (str.indexOf('\n') > -1) { - if (array) { - str = str.split('\n').map(function (line) { - return ' ' + line; - }).join('\n').substr(2); - } else { - str = '\n' + str.split('\n').map(function (line) { - return ' ' + line; - }).join('\n'); - } - } - } else { - str = ctx.stylize('[Circular]', 'special'); - } - } - - if (isUndefined(name)) { - if (array && key.match(/^\d+$/)) { - return str; - } - - name = JSON.stringify('' + key); - - if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { - name = name.substr(1, name.length - 2); - name = ctx.stylize(name, 'name'); - } else { - name = name.replace(/'/g, "\\'").replace(/\\"/g, '"').replace(/(^"|"$)/g, "'"); - name = ctx.stylize(name, 'string'); - } - } - - return name + ': ' + str; -} - -function reduceToSingleString(output, base, braces) { - var numLinesEst = 0; - var length = output.reduce(function (prev, cur) { - numLinesEst++; - if (cur.indexOf('\n') >= 0) numLinesEst++; - return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; - }, 0); - - if (length > 60) { - return braces[0] + (base === '' ? '' : base + '\n ') + ' ' + output.join(',\n ') + ' ' + braces[1]; - } - - return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; -} // NOTE: These type checking functions intentionally don't use `instanceof` -// because it is fragile and can be easily faked with `Object.create()`. - - -function isArray(ar) { - return Array.isArray(ar); -} - -exports.isArray = isArray; - -function isBoolean(arg) { - return typeof arg === 'boolean'; -} - -exports.isBoolean = isBoolean; - -function isNull(arg) { - return arg === null; -} - -exports.isNull = isNull; - -function isNullOrUndefined(arg) { - return arg == null; -} - -exports.isNullOrUndefined = isNullOrUndefined; - -function isNumber(arg) { - return typeof arg === 'number'; -} - -exports.isNumber = isNumber; - -function isString(arg) { - return typeof arg === 'string'; -} - -exports.isString = isString; - -function isSymbol(arg) { - return typeof arg === 'symbol'; -} - -exports.isSymbol = isSymbol; - -function isUndefined(arg) { - return arg === void 0; -} - -exports.isUndefined = isUndefined; - -function isRegExp(re) { - return isObject(re) && objectToString(re) === '[object RegExp]'; -} - -exports.isRegExp = isRegExp; - -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} - -exports.isObject = isObject; - -function isDate(d) { - return isObject(d) && objectToString(d) === '[object Date]'; -} - -exports.isDate = isDate; - -function isError(e) { - return isObject(e) && (objectToString(e) === '[object Error]' || e instanceof Error); -} - -exports.isError = isError; - -function isFunction(arg) { - return typeof arg === 'function'; -} - -exports.isFunction = isFunction; - -function isPrimitive(arg) { - return arg === null || typeof arg === 'boolean' || typeof arg === 'number' || typeof arg === 'string' || typeof arg === 'symbol' || // ES6 symbol - typeof arg === 'undefined'; -} - -exports.isPrimitive = isPrimitive; -exports.isBuffer = require('./support/isBuffer'); - -function objectToString(o) { - return Object.prototype.toString.call(o); -} - -function pad(n) { - return n < 10 ? '0' + n.toString(10) : n.toString(10); -} - -var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; // 26 Feb 16:19:34 - -function timestamp() { - var d = new Date(); - var time = [pad(d.getHours()), pad(d.getMinutes()), pad(d.getSeconds())].join(':'); - return [d.getDate(), months[d.getMonth()], time].join(' '); -} // log is just a thin wrapper to console.log that prepends a timestamp - - -exports.log = function () { - console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); -}; -/** - * Inherit the prototype methods from one constructor into another. - * - * The Function.prototype.inherits from lang.js rewritten as a standalone - * function (not on Function.prototype). NOTE: If this file is to be loaded - * during bootstrapping this function needs to be rewritten using some native - * functions as prototype setup using normal JavaScript does not work as - * expected during bootstrapping (see mirror.js in r114903). - * - * @param {function} ctor Constructor function which needs to inherit the - * prototype. - * @param {function} superCtor Constructor function to inherit prototype from. - */ - - -exports.inherits = require('inherits'); - -exports._extend = function (origin, add) { - // Don't do anything if add isn't an object - if (!add || !isObject(add)) return origin; - var keys = Object.keys(add); - var i = keys.length; - - while (i--) { - origin[keys[i]] = add[keys[i]]; - } - - return origin; -}; - -function hasOwnProperty(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); -} -},{"./support/isBuffer":"rd3l","inherits":"fCKU","process":"pBGv"}],"DlZn":[function(require,module,exports) { -var global = arguments[3]; -'use strict'; - -var objectAssign = require('object-assign'); - -// compare and isBuffer taken from https://github.com/feross/buffer/blob/680e9e5e488f22aac27599a57dc844a6315928dd/index.js -// original notice: - -/*! - * The buffer module from node.js, for the browser. - * - * @author Feross Aboukhadijeh - * @license MIT - */ -function compare(a, b) { - if (a === b) { - return 0; - } - - var x = a.length; - var y = b.length; - - for (var i = 0, len = Math.min(x, y); i < len; ++i) { - if (a[i] !== b[i]) { - x = a[i]; - y = b[i]; - break; - } - } - - if (x < y) { - return -1; - } - if (y < x) { - return 1; - } - return 0; -} -function isBuffer(b) { - if (global.Buffer && typeof global.Buffer.isBuffer === 'function') { - return global.Buffer.isBuffer(b); - } - return !!(b != null && b._isBuffer); -} - -// based on node assert, original notice: -// NB: The URL to the CommonJS spec is kept just for tradition. -// node-assert has evolved a lot since then, both in API and behavior. - -// http://wiki.commonjs.org/wiki/Unit_Testing/1.0 -// -// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8! -// -// Originally from narwhal.js (http://narwhaljs.org) -// Copyright (c) 2009 Thomas Robinson <280north.com> -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the 'Software'), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -var util = require('util/'); -var hasOwn = Object.prototype.hasOwnProperty; -var pSlice = Array.prototype.slice; -var functionsHaveNames = (function () { - return function foo() {}.name === 'foo'; -}()); -function pToString (obj) { - return Object.prototype.toString.call(obj); -} -function isView(arrbuf) { - if (isBuffer(arrbuf)) { - return false; - } - if (typeof global.ArrayBuffer !== 'function') { - return false; - } - if (typeof ArrayBuffer.isView === 'function') { - return ArrayBuffer.isView(arrbuf); - } - if (!arrbuf) { - return false; - } - if (arrbuf instanceof DataView) { - return true; - } - if (arrbuf.buffer && arrbuf.buffer instanceof ArrayBuffer) { - return true; - } - return false; -} -// 1. The assert module provides functions that throw -// AssertionError's when particular conditions are not met. The -// assert module must conform to the following interface. - -var assert = module.exports = ok; - -// 2. The AssertionError is defined in assert. -// new assert.AssertionError({ message: message, -// actual: actual, -// expected: expected }) - -var regex = /\s*function\s+([^\(\s]*)\s*/; -// based on https://github.com/ljharb/function.prototype.name/blob/adeeeec8bfcc6068b187d7d9fb3d5bb1d3a30899/implementation.js -function getName(func) { - if (!util.isFunction(func)) { - return; - } - if (functionsHaveNames) { - return func.name; - } - var str = func.toString(); - var match = str.match(regex); - return match && match[1]; -} -assert.AssertionError = function AssertionError(options) { - this.name = 'AssertionError'; - this.actual = options.actual; - this.expected = options.expected; - this.operator = options.operator; - if (options.message) { - this.message = options.message; - this.generatedMessage = false; - } else { - this.message = getMessage(this); - this.generatedMessage = true; - } - var stackStartFunction = options.stackStartFunction || fail; - if (Error.captureStackTrace) { - Error.captureStackTrace(this, stackStartFunction); - } else { - // non v8 browsers so we can have a stacktrace - var err = new Error(); - if (err.stack) { - var out = err.stack; - - // try to strip useless frames - var fn_name = getName(stackStartFunction); - var idx = out.indexOf('\n' + fn_name); - if (idx >= 0) { - // once we have located the function frame - // we need to strip out everything before it (and its line) - var next_line = out.indexOf('\n', idx + 1); - out = out.substring(next_line + 1); - } - - this.stack = out; - } - } -}; - -// assert.AssertionError instanceof Error -util.inherits(assert.AssertionError, Error); - -function truncate(s, n) { - if (typeof s === 'string') { - return s.length < n ? s : s.slice(0, n); - } else { - return s; - } -} -function inspect(something) { - if (functionsHaveNames || !util.isFunction(something)) { - return util.inspect(something); - } - var rawname = getName(something); - var name = rawname ? ': ' + rawname : ''; - return '[Function' + name + ']'; -} -function getMessage(self) { - return truncate(inspect(self.actual), 128) + ' ' + - self.operator + ' ' + - truncate(inspect(self.expected), 128); -} - -// At present only the three keys mentioned above are used and -// understood by the spec. Implementations or sub modules can pass -// other keys to the AssertionError's constructor - they will be -// ignored. - -// 3. All of the following functions must throw an AssertionError -// when a corresponding condition is not met, with a message that -// may be undefined if not provided. All assertion methods provide -// both the actual and expected values to the assertion error for -// display purposes. - -function fail(actual, expected, message, operator, stackStartFunction) { - throw new assert.AssertionError({ - message: message, - actual: actual, - expected: expected, - operator: operator, - stackStartFunction: stackStartFunction - }); -} - -// EXTENSION! allows for well behaved errors defined elsewhere. -assert.fail = fail; - -// 4. Pure assertion tests whether a value is truthy, as determined -// by !!guard. -// assert.ok(guard, message_opt); -// This statement is equivalent to assert.equal(true, !!guard, -// message_opt);. To test strictly for the value true, use -// assert.strictEqual(true, guard, message_opt);. - -function ok(value, message) { - if (!value) fail(value, true, message, '==', assert.ok); -} -assert.ok = ok; - -// 5. The equality assertion tests shallow, coercive equality with -// ==. -// assert.equal(actual, expected, message_opt); - -assert.equal = function equal(actual, expected, message) { - if (actual != expected) fail(actual, expected, message, '==', assert.equal); -}; - -// 6. The non-equality assertion tests for whether two objects are not equal -// with != assert.notEqual(actual, expected, message_opt); - -assert.notEqual = function notEqual(actual, expected, message) { - if (actual == expected) { - fail(actual, expected, message, '!=', assert.notEqual); - } -}; - -// 7. The equivalence assertion tests a deep equality relation. -// assert.deepEqual(actual, expected, message_opt); - -assert.deepEqual = function deepEqual(actual, expected, message) { - if (!_deepEqual(actual, expected, false)) { - fail(actual, expected, message, 'deepEqual', assert.deepEqual); - } -}; - -assert.deepStrictEqual = function deepStrictEqual(actual, expected, message) { - if (!_deepEqual(actual, expected, true)) { - fail(actual, expected, message, 'deepStrictEqual', assert.deepStrictEqual); - } -}; - -function _deepEqual(actual, expected, strict, memos) { - // 7.1. All identical values are equivalent, as determined by ===. - if (actual === expected) { - return true; - } else if (isBuffer(actual) && isBuffer(expected)) { - return compare(actual, expected) === 0; - - // 7.2. If the expected value is a Date object, the actual value is - // equivalent if it is also a Date object that refers to the same time. - } else if (util.isDate(actual) && util.isDate(expected)) { - return actual.getTime() === expected.getTime(); - - // 7.3 If the expected value is a RegExp object, the actual value is - // equivalent if it is also a RegExp object with the same source and - // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`). - } else if (util.isRegExp(actual) && util.isRegExp(expected)) { - return actual.source === expected.source && - actual.global === expected.global && - actual.multiline === expected.multiline && - actual.lastIndex === expected.lastIndex && - actual.ignoreCase === expected.ignoreCase; - - // 7.4. Other pairs that do not both pass typeof value == 'object', - // equivalence is determined by ==. - } else if ((actual === null || typeof actual !== 'object') && - (expected === null || typeof expected !== 'object')) { - return strict ? actual === expected : actual == expected; - - // If both values are instances of typed arrays, wrap their underlying - // ArrayBuffers in a Buffer each to increase performance - // This optimization requires the arrays to have the same type as checked by - // Object.prototype.toString (aka pToString). Never perform binary - // comparisons for Float*Arrays, though, since e.g. +0 === -0 but their - // bit patterns are not identical. - } else if (isView(actual) && isView(expected) && - pToString(actual) === pToString(expected) && - !(actual instanceof Float32Array || - actual instanceof Float64Array)) { - return compare(new Uint8Array(actual.buffer), - new Uint8Array(expected.buffer)) === 0; - - // 7.5 For all other Object pairs, including Array objects, equivalence is - // determined by having the same number of owned properties (as verified - // with Object.prototype.hasOwnProperty.call), the same set of keys - // (although not necessarily the same order), equivalent values for every - // corresponding key, and an identical 'prototype' property. Note: this - // accounts for both named and indexed properties on Arrays. - } else if (isBuffer(actual) !== isBuffer(expected)) { - return false; - } else { - memos = memos || {actual: [], expected: []}; - - var actualIndex = memos.actual.indexOf(actual); - if (actualIndex !== -1) { - if (actualIndex === memos.expected.indexOf(expected)) { - return true; - } - } - - memos.actual.push(actual); - memos.expected.push(expected); - - return objEquiv(actual, expected, strict, memos); - } -} - -function isArguments(object) { - return Object.prototype.toString.call(object) == '[object Arguments]'; -} - -function objEquiv(a, b, strict, actualVisitedObjects) { - if (a === null || a === undefined || b === null || b === undefined) - return false; - // if one is a primitive, the other must be same - if (util.isPrimitive(a) || util.isPrimitive(b)) - return a === b; - if (strict && Object.getPrototypeOf(a) !== Object.getPrototypeOf(b)) - return false; - var aIsArgs = isArguments(a); - var bIsArgs = isArguments(b); - if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs)) - return false; - if (aIsArgs) { - a = pSlice.call(a); - b = pSlice.call(b); - return _deepEqual(a, b, strict); - } - var ka = objectKeys(a); - var kb = objectKeys(b); - var key, i; - // having the same number of owned properties (keys incorporates - // hasOwnProperty) - if (ka.length !== kb.length) - return false; - //the same set of keys (although not necessarily the same order), - ka.sort(); - kb.sort(); - //~~~cheap key test - for (i = ka.length - 1; i >= 0; i--) { - if (ka[i] !== kb[i]) - return false; - } - //equivalent values for every corresponding key, and - //~~~possibly expensive deep test - for (i = ka.length - 1; i >= 0; i--) { - key = ka[i]; - if (!_deepEqual(a[key], b[key], strict, actualVisitedObjects)) - return false; - } - return true; -} - -// 8. The non-equivalence assertion tests for any deep inequality. -// assert.notDeepEqual(actual, expected, message_opt); - -assert.notDeepEqual = function notDeepEqual(actual, expected, message) { - if (_deepEqual(actual, expected, false)) { - fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual); - } -}; - -assert.notDeepStrictEqual = notDeepStrictEqual; -function notDeepStrictEqual(actual, expected, message) { - if (_deepEqual(actual, expected, true)) { - fail(actual, expected, message, 'notDeepStrictEqual', notDeepStrictEqual); - } -} - - -// 9. The strict equality assertion tests strict equality, as determined by ===. -// assert.strictEqual(actual, expected, message_opt); - -assert.strictEqual = function strictEqual(actual, expected, message) { - if (actual !== expected) { - fail(actual, expected, message, '===', assert.strictEqual); - } -}; - -// 10. The strict non-equality assertion tests for strict inequality, as -// determined by !==. assert.notStrictEqual(actual, expected, message_opt); - -assert.notStrictEqual = function notStrictEqual(actual, expected, message) { - if (actual === expected) { - fail(actual, expected, message, '!==', assert.notStrictEqual); - } -}; - -function expectedException(actual, expected) { - if (!actual || !expected) { - return false; - } - - if (Object.prototype.toString.call(expected) == '[object RegExp]') { - return expected.test(actual); - } - - try { - if (actual instanceof expected) { - return true; - } - } catch (e) { - // Ignore. The instanceof check doesn't work for arrow functions. - } - - if (Error.isPrototypeOf(expected)) { - return false; - } - - return expected.call({}, actual) === true; -} - -function _tryBlock(block) { - var error; - try { - block(); - } catch (e) { - error = e; - } - return error; -} - -function _throws(shouldThrow, block, expected, message) { - var actual; - - if (typeof block !== 'function') { - throw new TypeError('"block" argument must be a function'); - } - - if (typeof expected === 'string') { - message = expected; - expected = null; - } - - actual = _tryBlock(block); - - message = (expected && expected.name ? ' (' + expected.name + ').' : '.') + - (message ? ' ' + message : '.'); - - if (shouldThrow && !actual) { - fail(actual, expected, 'Missing expected exception' + message); - } - - var userProvidedMessage = typeof message === 'string'; - var isUnwantedException = !shouldThrow && util.isError(actual); - var isUnexpectedException = !shouldThrow && actual && !expected; - - if ((isUnwantedException && - userProvidedMessage && - expectedException(actual, expected)) || - isUnexpectedException) { - fail(actual, expected, 'Got unwanted exception' + message); - } - - if ((shouldThrow && actual && expected && - !expectedException(actual, expected)) || (!shouldThrow && actual)) { - throw actual; - } -} - -// 11. Expected to throw an error: -// assert.throws(block, Error_opt, message_opt); - -assert.throws = function(block, /*optional*/error, /*optional*/message) { - _throws(true, block, error, message); -}; - -// EXTENSION! This is annoying to write outside this module. -assert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) { - _throws(false, block, error, message); -}; - -assert.ifError = function(err) { if (err) throw err; }; - -// Expose a strict only variant of assert -function strict(value, message) { - if (!value) fail(value, true, message, '==', strict); -} -assert.strict = objectAssign(strict, assert, { - equal: assert.strictEqual, - deepEqual: assert.deepStrictEqual, - notEqual: assert.notStrictEqual, - notDeepEqual: assert.notDeepStrictEqual -}); -assert.strict.strict = assert.strict; - -var objectKeys = Object.keys || function (obj) { - var keys = []; - for (var key in obj) { - if (hasOwn.call(obj, key)) keys.push(key); - } - return keys; -}; - -},{"object-assign":"J4Nk","util/":"XOAc"}],"ou4A":[function(require,module,exports) { -"use strict"; -/** - * This logic is in a separate file with no dependencies so that it can be - * loaded and executed as soon as possible to fulfill the purpose of the protocol - * detection technique. The effectiveness of this is obviously subject to how web - * apps bundle/consume the blockstack.js lib. - */ - -Object.defineProperty(exports, "__esModule", { - value: true -}); -var GLOBAL_DETECTION_CACHE_KEY = '_blockstackDidCheckEchoReply'; -var ECHO_REPLY_PARAM = 'echoReply'; -var AUTH_CONTINUATION_PARAM = 'authContinuation'; -/** - * Checks if the current window location URL contains an 'echoReply' parameter - * which indicates that this page was only opened to signal back to the originating - * tab that the protocol handler is installed. - * If found, then localStorage events are used to notify the other tab, - * and this page is redirected back to the Blockstack authenticator URL. - * This function caches its result and will not trigger multiple redirects when - * invoked multiple times. - * @returns True if detected and the page will be automatically redirected. - * @hidden - */ - -function protocolEchoReplyDetection() { - // Check that the `window` APIs exist - var globalScope; - - if (typeof self !== 'undefined') { - globalScope = self; - } else if (typeof window !== 'undefined') { - globalScope = window; - } else { - // Exit detection function - we are not running in a browser environment. - return false; - } - - if (!globalScope.location || !globalScope.localStorage || !globalScope.URLSearchParams) { - // Exit detection function - we are not running in a browser environment. - return false; - } // Avoid performing the check twice and triggered multiple redirect timers. - - - var existingDetection = globalScope[GLOBAL_DETECTION_CACHE_KEY]; - - if (typeof existingDetection === 'boolean') { - return existingDetection; - } - - var searchParams = new globalScope.URLSearchParams(globalScope.location.search); - var echoReplyParam = searchParams.get(ECHO_REPLY_PARAM); - - if (echoReplyParam) { - globalScope[GLOBAL_DETECTION_CACHE_KEY] = true; // Use localStorage to notify originated tab that protocol handler is available and working. - - var echoReplyKey = "echo-reply-".concat(echoReplyParam); // Set the echo-reply result in localStorage for the other window to see. - - globalScope.localStorage.setItem(echoReplyKey, 'success'); // Redirect back to the localhost auth url, as opposed to another protocol launch. - // This will re-use the same tab rather than creating another useless one. - - globalScope.setTimeout(function () { - var authContinuationParam = searchParams.get(AUTH_CONTINUATION_PARAM); - globalScope.location.href = authContinuationParam; - }, 10); - return true; - } - - return false; -} - -exports.protocolEchoReplyDetection = protocolEchoReplyDetection; -},{}],"UTxZ":[function(require,module,exports) { -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -/** -* @ignore -*/ - -exports.BLOCKSTACK_HANDLER = 'blockstack'; -/** -* @ignore -*/ - -exports.BLOCKSTACK_STORAGE_LABEL = 'blockstack'; -/** -* This constant is used in the [[redirectToSignInWithAuthRequest]] -*/ - -exports.DEFAULT_BLOCKSTACK_HOST = 'https://browser.blockstack.org/auth'; -/** -* @ignore -*/ - -exports.DEFAULT_SCOPE = ["store_write" -/* store_write */ -]; -/** -* @ignore -*/ - -exports.BLOCKSTACK_APP_PRIVATE_KEY_LABEL = 'blockstack-transit-private-key'; -/** -* @ignore -*/ - -exports.BLOCKSTACK_DEFAULT_GAIA_HUB_URL = 'https://hub.blockstack.org'; -/** -* @ignore -*/ - -exports.DEFAULT_CORE_NODE = 'https://core.blockstack.org'; -/** -* @ignore -*/ - -exports.NAME_LOOKUP_PATH = '/v1/names'; -/** -* @ignore -*/ - -exports.LOCALSTORAGE_SESSION_KEY = 'blockstack-session'; -},{}],"oWqx":[function(require,module,exports) { -var global = arguments[3]; -var define; -/*! https://mths.be/punycode v1.4.1 by @mathias */ -;(function(root) { - - /** Detect free variables */ - var freeExports = typeof exports == 'object' && exports && - !exports.nodeType && exports; - var freeModule = typeof module == 'object' && module && - !module.nodeType && module; - var freeGlobal = typeof global == 'object' && global; - if ( - freeGlobal.global === freeGlobal || - freeGlobal.window === freeGlobal || - freeGlobal.self === freeGlobal - ) { - root = freeGlobal; - } - - /** - * The `punycode` object. - * @name punycode - * @type Object - */ - var punycode, - - /** Highest positive signed 32-bit float value */ - maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1 - - /** Bootstring parameters */ - base = 36, - tMin = 1, - tMax = 26, - skew = 38, - damp = 700, - initialBias = 72, - initialN = 128, // 0x80 - delimiter = '-', // '\x2D' - - /** Regular expressions */ - regexPunycode = /^xn--/, - regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars - regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators - - /** Error messages */ - errors = { - 'overflow': 'Overflow: input needs wider integers to process', - 'not-basic': 'Illegal input >= 0x80 (not a basic code point)', - 'invalid-input': 'Invalid input' - }, - - /** Convenience shortcuts */ - baseMinusTMin = base - tMin, - floor = Math.floor, - stringFromCharCode = String.fromCharCode, - - /** Temporary variable */ - key; - - /*--------------------------------------------------------------------------*/ - - /** - * A generic error utility function. - * @private - * @param {String} type The error type. - * @returns {Error} Throws a `RangeError` with the applicable error message. - */ - function error(type) { - throw new RangeError(errors[type]); - } - - /** - * A generic `Array#map` utility function. - * @private - * @param {Array} array The array to iterate over. - * @param {Function} callback The function that gets called for every array - * item. - * @returns {Array} A new array of values returned by the callback function. - */ - function map(array, fn) { - var length = array.length; - var result = []; - while (length--) { - result[length] = fn(array[length]); - } - return result; - } - - /** - * A simple `Array#map`-like wrapper to work with domain name strings or email - * addresses. - * @private - * @param {String} domain The domain name or email address. - * @param {Function} callback The function that gets called for every - * character. - * @returns {Array} A new string of characters returned by the callback - * function. - */ - function mapDomain(string, fn) { - var parts = string.split('@'); - var result = ''; - if (parts.length > 1) { - // In email addresses, only the domain name should be punycoded. Leave - // the local part (i.e. everything up to `@`) intact. - result = parts[0] + '@'; - string = parts[1]; - } - // Avoid `split(regex)` for IE8 compatibility. See #17. - string = string.replace(regexSeparators, '\x2E'); - var labels = string.split('.'); - var encoded = map(labels, fn).join('.'); - return result + encoded; - } - - /** - * Creates an array containing the numeric code points of each Unicode - * character in the string. While JavaScript uses UCS-2 internally, - * this function will convert a pair of surrogate halves (each of which - * UCS-2 exposes as separate characters) into a single code point, - * matching UTF-16. - * @see `punycode.ucs2.encode` - * @see - * @memberOf punycode.ucs2 - * @name decode - * @param {String} string The Unicode input string (UCS-2). - * @returns {Array} The new array of code points. - */ - function ucs2decode(string) { - var output = [], - counter = 0, - length = string.length, - value, - extra; - while (counter < length) { - value = string.charCodeAt(counter++); - if (value >= 0xD800 && value <= 0xDBFF && counter < length) { - // high surrogate, and there is a next character - extra = string.charCodeAt(counter++); - if ((extra & 0xFC00) == 0xDC00) { // low surrogate - output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); - } else { - // unmatched surrogate; only append this code unit, in case the next - // code unit is the high surrogate of a surrogate pair - output.push(value); - counter--; - } - } else { - output.push(value); - } - } - return output; - } - - /** - * Creates a string based on an array of numeric code points. - * @see `punycode.ucs2.decode` - * @memberOf punycode.ucs2 - * @name encode - * @param {Array} codePoints The array of numeric code points. - * @returns {String} The new Unicode string (UCS-2). - */ - function ucs2encode(array) { - return map(array, function(value) { - var output = ''; - if (value > 0xFFFF) { - value -= 0x10000; - output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800); - value = 0xDC00 | value & 0x3FF; - } - output += stringFromCharCode(value); - return output; - }).join(''); - } - - /** - * Converts a basic code point into a digit/integer. - * @see `digitToBasic()` - * @private - * @param {Number} codePoint The basic numeric code point value. - * @returns {Number} The numeric value of a basic code point (for use in - * representing integers) in the range `0` to `base - 1`, or `base` if - * the code point does not represent a value. - */ - function basicToDigit(codePoint) { - if (codePoint - 48 < 10) { - return codePoint - 22; - } - if (codePoint - 65 < 26) { - return codePoint - 65; - } - if (codePoint - 97 < 26) { - return codePoint - 97; - } - return base; - } - - /** - * Converts a digit/integer into a basic code point. - * @see `basicToDigit()` - * @private - * @param {Number} digit The numeric value of a basic code point. - * @returns {Number} The basic code point whose value (when used for - * representing integers) is `digit`, which needs to be in the range - * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is - * used; else, the lowercase form is used. The behavior is undefined - * if `flag` is non-zero and `digit` has no uppercase form. - */ - function digitToBasic(digit, flag) { - // 0..25 map to ASCII a..z or A..Z - // 26..35 map to ASCII 0..9 - return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); - } - - /** - * Bias adaptation function as per section 3.4 of RFC 3492. - * https://tools.ietf.org/html/rfc3492#section-3.4 - * @private - */ - function adapt(delta, numPoints, firstTime) { - var k = 0; - delta = firstTime ? floor(delta / damp) : delta >> 1; - delta += floor(delta / numPoints); - for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) { - delta = floor(delta / baseMinusTMin); - } - return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); - } - - /** - * Converts a Punycode string of ASCII-only symbols to a string of Unicode - * symbols. - * @memberOf punycode - * @param {String} input The Punycode string of ASCII-only symbols. - * @returns {String} The resulting string of Unicode symbols. - */ - function decode(input) { - // Don't use UCS-2 - var output = [], - inputLength = input.length, - out, - i = 0, - n = initialN, - bias = initialBias, - basic, - j, - index, - oldi, - w, - k, - digit, - t, - /** Cached calculation results */ - baseMinusT; - - // Handle the basic code points: let `basic` be the number of input code - // points before the last delimiter, or `0` if there is none, then copy - // the first basic code points to the output. - - basic = input.lastIndexOf(delimiter); - if (basic < 0) { - basic = 0; - } - - for (j = 0; j < basic; ++j) { - // if it's not a basic code point - if (input.charCodeAt(j) >= 0x80) { - error('not-basic'); - } - output.push(input.charCodeAt(j)); - } - - // Main decoding loop: start just after the last delimiter if any basic code - // points were copied; start at the beginning otherwise. - - for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) { - - // `index` is the index of the next character to be consumed. - // Decode a generalized variable-length integer into `delta`, - // which gets added to `i`. The overflow checking is easier - // if we increase `i` as we go, then subtract off its starting - // value at the end to obtain `delta`. - for (oldi = i, w = 1, k = base; /* no condition */; k += base) { - - if (index >= inputLength) { - error('invalid-input'); - } - - digit = basicToDigit(input.charCodeAt(index++)); - - if (digit >= base || digit > floor((maxInt - i) / w)) { - error('overflow'); - } - - i += digit * w; - t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); - - if (digit < t) { - break; - } - - baseMinusT = base - t; - if (w > floor(maxInt / baseMinusT)) { - error('overflow'); - } - - w *= baseMinusT; - - } - - out = output.length + 1; - bias = adapt(i - oldi, out, oldi == 0); - - // `i` was supposed to wrap around from `out` to `0`, - // incrementing `n` each time, so we'll fix that now: - if (floor(i / out) > maxInt - n) { - error('overflow'); - } - - n += floor(i / out); - i %= out; - - // Insert `n` at position `i` of the output - output.splice(i++, 0, n); - - } - - return ucs2encode(output); - } - - /** - * Converts a string of Unicode symbols (e.g. a domain name label) to a - * Punycode string of ASCII-only symbols. - * @memberOf punycode - * @param {String} input The string of Unicode symbols. - * @returns {String} The resulting Punycode string of ASCII-only symbols. - */ - function encode(input) { - var n, - delta, - handledCPCount, - basicLength, - bias, - j, - m, - q, - k, - t, - currentValue, - output = [], - /** `inputLength` will hold the number of code points in `input`. */ - inputLength, - /** Cached calculation results */ - handledCPCountPlusOne, - baseMinusT, - qMinusT; - - // Convert the input in UCS-2 to Unicode - input = ucs2decode(input); - - // Cache the length - inputLength = input.length; - - // Initialize the state - n = initialN; - delta = 0; - bias = initialBias; - - // Handle the basic code points - for (j = 0; j < inputLength; ++j) { - currentValue = input[j]; - if (currentValue < 0x80) { - output.push(stringFromCharCode(currentValue)); - } - } - - handledCPCount = basicLength = output.length; - - // `handledCPCount` is the number of code points that have been handled; - // `basicLength` is the number of basic code points. - - // Finish the basic string - if it is not empty - with a delimiter - if (basicLength) { - output.push(delimiter); - } - - // Main encoding loop: - while (handledCPCount < inputLength) { - - // All non-basic code points < n have been handled already. Find the next - // larger one: - for (m = maxInt, j = 0; j < inputLength; ++j) { - currentValue = input[j]; - if (currentValue >= n && currentValue < m) { - m = currentValue; - } - } - - // Increase `delta` enough to advance the decoder's state to , - // but guard against overflow - handledCPCountPlusOne = handledCPCount + 1; - if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { - error('overflow'); - } - - delta += (m - n) * handledCPCountPlusOne; - n = m; - - for (j = 0; j < inputLength; ++j) { - currentValue = input[j]; - - if (currentValue < n && ++delta > maxInt) { - error('overflow'); - } - - if (currentValue == n) { - // Represent delta as a generalized variable-length integer - for (q = delta, k = base; /* no condition */; k += base) { - t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); - if (q < t) { - break; - } - qMinusT = q - t; - baseMinusT = base - t; - output.push( - stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)) - ); - q = floor(qMinusT / baseMinusT); - } - - output.push(stringFromCharCode(digitToBasic(q, 0))); - bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); - delta = 0; - ++handledCPCount; - } - } - - ++delta; - ++n; - - } - return output.join(''); - } - - /** - * Converts a Punycode string representing a domain name or an email address - * to Unicode. Only the Punycoded parts of the input will be converted, i.e. - * it doesn't matter if you call it on a string that has already been - * converted to Unicode. - * @memberOf punycode - * @param {String} input The Punycoded domain name or email address to - * convert to Unicode. - * @returns {String} The Unicode representation of the given Punycode - * string. - */ - function toUnicode(input) { - return mapDomain(input, function(string) { - return regexPunycode.test(string) - ? decode(string.slice(4).toLowerCase()) - : string; - }); - } - - /** - * Converts a Unicode string representing a domain name or an email address to - * Punycode. Only the non-ASCII parts of the domain name will be converted, - * i.e. it doesn't matter if you call it with a domain that's already in - * ASCII. - * @memberOf punycode - * @param {String} input The domain name or email address to convert, as a - * Unicode string. - * @returns {String} The Punycode representation of the given domain name or - * email address. - */ - function toASCII(input) { - return mapDomain(input, function(string) { - return regexNonASCII.test(string) - ? 'xn--' + encode(string) - : string; - }); - } - - /*--------------------------------------------------------------------------*/ - - /** Define the public API */ - punycode = { - /** - * A string representing the current Punycode.js version number. - * @memberOf punycode - * @type String - */ - 'version': '1.4.1', - /** - * An object of methods to convert from JavaScript's internal character - * representation (UCS-2) to Unicode code points, and back. - * @see - * @memberOf punycode - * @type Object - */ - 'ucs2': { - 'decode': ucs2decode, - 'encode': ucs2encode - }, - 'decode': decode, - 'encode': encode, - 'toASCII': toASCII, - 'toUnicode': toUnicode - }; - - /** Expose `punycode` */ - // Some AMD build optimizers, like r.js, check for specific condition patterns - // like the following: - if ( - typeof define == 'function' && - typeof define.amd == 'object' && - define.amd - ) { - define('punycode', function() { - return punycode; - }); - } else if (freeExports && freeModule) { - if (module.exports == freeExports) { - // in Node.js, io.js, or RingoJS v0.8.0+ - freeModule.exports = punycode; - } else { - // in Narwhal or RingoJS v0.7.0- - for (key in punycode) { - punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]); - } - } - } else { - // in Rhino or a web browser - root.punycode = punycode; - } - -}(this)); - -},{}],"YsIc":[function(require,module,exports) { -'use strict'; - -module.exports = { - isString: function(arg) { - return typeof(arg) === 'string'; - }, - isObject: function(arg) { - return typeof(arg) === 'object' && arg !== null; - }, - isNull: function(arg) { - return arg === null; - }, - isNullOrUndefined: function(arg) { - return arg == null; - } -}; - -},{}],"J6GP":[function(require,module,exports) { -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. -'use strict'; // If obj.hasOwnProperty has been overridden, then calling -// obj.hasOwnProperty(prop) will break. -// See: https://github.com/joyent/node/issues/1707 - -function hasOwnProperty(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); -} - -module.exports = function (qs, sep, eq, options) { - sep = sep || '&'; - eq = eq || '='; - var obj = {}; - - if (typeof qs !== 'string' || qs.length === 0) { - return obj; - } - - var regexp = /\+/g; - qs = qs.split(sep); - var maxKeys = 1000; - - if (options && typeof options.maxKeys === 'number') { - maxKeys = options.maxKeys; - } - - var len = qs.length; // maxKeys <= 0 means that we should not limit keys count - - if (maxKeys > 0 && len > maxKeys) { - len = maxKeys; - } - - for (var i = 0; i < len; ++i) { - var x = qs[i].replace(regexp, '%20'), - idx = x.indexOf(eq), - kstr, - vstr, - k, - v; - - if (idx >= 0) { - kstr = x.substr(0, idx); - vstr = x.substr(idx + 1); - } else { - kstr = x; - vstr = ''; - } - - k = decodeURIComponent(kstr); - v = decodeURIComponent(vstr); - - if (!hasOwnProperty(obj, k)) { - obj[k] = v; - } else if (isArray(obj[k])) { - obj[k].push(v); - } else { - obj[k] = [obj[k], v]; - } - } - - return obj; -}; - -var isArray = Array.isArray || function (xs) { - return Object.prototype.toString.call(xs) === '[object Array]'; -}; -},{}],"bvhO":[function(require,module,exports) { -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. -'use strict'; - -var stringifyPrimitive = function (v) { - switch (typeof v) { - case 'string': - return v; - - case 'boolean': - return v ? 'true' : 'false'; - - case 'number': - return isFinite(v) ? v : ''; - - default: - return ''; - } -}; - -module.exports = function (obj, sep, eq, name) { - sep = sep || '&'; - eq = eq || '='; - - if (obj === null) { - obj = undefined; - } - - if (typeof obj === 'object') { - return map(objectKeys(obj), function (k) { - var ks = encodeURIComponent(stringifyPrimitive(k)) + eq; - - if (isArray(obj[k])) { - return map(obj[k], function (v) { - return ks + encodeURIComponent(stringifyPrimitive(v)); - }).join(sep); - } else { - return ks + encodeURIComponent(stringifyPrimitive(obj[k])); - } - }).join(sep); - } - - if (!name) return ''; - return encodeURIComponent(stringifyPrimitive(name)) + eq + encodeURIComponent(stringifyPrimitive(obj)); -}; - -var isArray = Array.isArray || function (xs) { - return Object.prototype.toString.call(xs) === '[object Array]'; -}; - -function map(xs, f) { - if (xs.map) return xs.map(f); - var res = []; - - for (var i = 0; i < xs.length; i++) { - res.push(f(xs[i], i)); - } - - return res; -} - -var objectKeys = Object.keys || function (obj) { - var res = []; - - for (var key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key); - } - - return res; -}; -},{}],"fk5h":[function(require,module,exports) { -'use strict'; - -exports.decode = exports.parse = require('./decode'); -exports.encode = exports.stringify = require('./encode'); -},{"./decode":"J6GP","./encode":"bvhO"}],"Mej7":[function(require,module,exports) { -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -'use strict'; - -var punycode = require('punycode'); -var util = require('./util'); - -exports.parse = urlParse; -exports.resolve = urlResolve; -exports.resolveObject = urlResolveObject; -exports.format = urlFormat; - -exports.Url = Url; - -function Url() { - this.protocol = null; - this.slashes = null; - this.auth = null; - this.host = null; - this.port = null; - this.hostname = null; - this.hash = null; - this.search = null; - this.query = null; - this.pathname = null; - this.path = null; - this.href = null; -} - -// Reference: RFC 3986, RFC 1808, RFC 2396 - -// define these here so at least they only have to be -// compiled once on the first module load. -var protocolPattern = /^([a-z0-9.+-]+:)/i, - portPattern = /:[0-9]*$/, - - // Special case for a simple path URL - simplePathPattern = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/, - - // RFC 2396: characters reserved for delimiting URLs. - // We actually just auto-escape these. - delims = ['<', '>', '"', '`', ' ', '\r', '\n', '\t'], - - // RFC 2396: characters not allowed for various reasons. - unwise = ['{', '}', '|', '\\', '^', '`'].concat(delims), - - // Allowed by RFCs, but cause of XSS attacks. Always escape these. - autoEscape = ['\''].concat(unwise), - // Characters that are never ever allowed in a hostname. - // Note that any invalid chars are also handled, but these - // are the ones that are *expected* to be seen, so we fast-path - // them. - nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape), - hostEndingChars = ['/', '?', '#'], - hostnameMaxLen = 255, - hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/, - hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/, - // protocols that can allow "unsafe" and "unwise" chars. - unsafeProtocol = { - 'javascript': true, - 'javascript:': true - }, - // protocols that never have a hostname. - hostlessProtocol = { - 'javascript': true, - 'javascript:': true - }, - // protocols that always contain a // bit. - slashedProtocol = { - 'http': true, - 'https': true, - 'ftp': true, - 'gopher': true, - 'file': true, - 'http:': true, - 'https:': true, - 'ftp:': true, - 'gopher:': true, - 'file:': true - }, - querystring = require('querystring'); - -function urlParse(url, parseQueryString, slashesDenoteHost) { - if (url && util.isObject(url) && url instanceof Url) return url; - - var u = new Url; - u.parse(url, parseQueryString, slashesDenoteHost); - return u; -} - -Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) { - if (!util.isString(url)) { - throw new TypeError("Parameter 'url' must be a string, not " + typeof url); - } - - // Copy chrome, IE, opera backslash-handling behavior. - // Back slashes before the query string get converted to forward slashes - // See: https://code.google.com/p/chromium/issues/detail?id=25916 - var queryIndex = url.indexOf('?'), - splitter = - (queryIndex !== -1 && queryIndex < url.indexOf('#')) ? '?' : '#', - uSplit = url.split(splitter), - slashRegex = /\\/g; - uSplit[0] = uSplit[0].replace(slashRegex, '/'); - url = uSplit.join(splitter); - - var rest = url; - - // trim before proceeding. - // This is to support parse stuff like " http://foo.com \n" - rest = rest.trim(); - - if (!slashesDenoteHost && url.split('#').length === 1) { - // Try fast path regexp - var simplePath = simplePathPattern.exec(rest); - if (simplePath) { - this.path = rest; - this.href = rest; - this.pathname = simplePath[1]; - if (simplePath[2]) { - this.search = simplePath[2]; - if (parseQueryString) { - this.query = querystring.parse(this.search.substr(1)); - } else { - this.query = this.search.substr(1); - } - } else if (parseQueryString) { - this.search = ''; - this.query = {}; - } - return this; - } - } - - var proto = protocolPattern.exec(rest); - if (proto) { - proto = proto[0]; - var lowerProto = proto.toLowerCase(); - this.protocol = lowerProto; - rest = rest.substr(proto.length); - } - - // figure out if it's got a host - // user@server is *always* interpreted as a hostname, and url - // resolution will treat //foo/bar as host=foo,path=bar because that's - // how the browser resolves relative URLs. - if (slashesDenoteHost || proto || rest.match(/^\/\/[^@\/]+@[^@\/]+/)) { - var slashes = rest.substr(0, 2) === '//'; - if (slashes && !(proto && hostlessProtocol[proto])) { - rest = rest.substr(2); - this.slashes = true; - } - } - - if (!hostlessProtocol[proto] && - (slashes || (proto && !slashedProtocol[proto]))) { - - // there's a hostname. - // the first instance of /, ?, ;, or # ends the host. - // - // If there is an @ in the hostname, then non-host chars *are* allowed - // to the left of the last @ sign, unless some host-ending character - // comes *before* the @-sign. - // URLs are obnoxious. - // - // ex: - // http://a@b@c/ => user:a@b host:c - // http://a@b?@c => user:a host:c path:/?@c - - // v0.12 TODO(isaacs): This is not quite how Chrome does things. - // Review our test case against browsers more comprehensively. - - // find the first instance of any hostEndingChars - var hostEnd = -1; - for (var i = 0; i < hostEndingChars.length; i++) { - var hec = rest.indexOf(hostEndingChars[i]); - if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) - hostEnd = hec; - } - - // at this point, either we have an explicit point where the - // auth portion cannot go past, or the last @ char is the decider. - var auth, atSign; - if (hostEnd === -1) { - // atSign can be anywhere. - atSign = rest.lastIndexOf('@'); - } else { - // atSign must be in auth portion. - // http://a@b/c@d => host:b auth:a path:/c@d - atSign = rest.lastIndexOf('@', hostEnd); - } - - // Now we have a portion which is definitely the auth. - // Pull that off. - if (atSign !== -1) { - auth = rest.slice(0, atSign); - rest = rest.slice(atSign + 1); - this.auth = decodeURIComponent(auth); - } - - // the host is the remaining to the left of the first non-host char - hostEnd = -1; - for (var i = 0; i < nonHostChars.length; i++) { - var hec = rest.indexOf(nonHostChars[i]); - if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) - hostEnd = hec; - } - // if we still have not hit it, then the entire thing is a host. - if (hostEnd === -1) - hostEnd = rest.length; - - this.host = rest.slice(0, hostEnd); - rest = rest.slice(hostEnd); - - // pull out port. - this.parseHost(); - - // we've indicated that there is a hostname, - // so even if it's empty, it has to be present. - this.hostname = this.hostname || ''; - - // if hostname begins with [ and ends with ] - // assume that it's an IPv6 address. - var ipv6Hostname = this.hostname[0] === '[' && - this.hostname[this.hostname.length - 1] === ']'; - - // validate a little. - if (!ipv6Hostname) { - var hostparts = this.hostname.split(/\./); - for (var i = 0, l = hostparts.length; i < l; i++) { - var part = hostparts[i]; - if (!part) continue; - if (!part.match(hostnamePartPattern)) { - var newpart = ''; - for (var j = 0, k = part.length; j < k; j++) { - if (part.charCodeAt(j) > 127) { - // we replace non-ASCII char with a temporary placeholder - // we need this to make sure size of hostname is not - // broken by replacing non-ASCII by nothing - newpart += 'x'; - } else { - newpart += part[j]; - } - } - // we test again with ASCII char only - if (!newpart.match(hostnamePartPattern)) { - var validParts = hostparts.slice(0, i); - var notHost = hostparts.slice(i + 1); - var bit = part.match(hostnamePartStart); - if (bit) { - validParts.push(bit[1]); - notHost.unshift(bit[2]); - } - if (notHost.length) { - rest = '/' + notHost.join('.') + rest; - } - this.hostname = validParts.join('.'); - break; - } - } - } - } - - if (this.hostname.length > hostnameMaxLen) { - this.hostname = ''; - } else { - // hostnames are always lower case. - this.hostname = this.hostname.toLowerCase(); - } - - if (!ipv6Hostname) { - // IDNA Support: Returns a punycoded representation of "domain". - // It only converts parts of the domain name that - // have non-ASCII characters, i.e. it doesn't matter if - // you call it with a domain that already is ASCII-only. - this.hostname = punycode.toASCII(this.hostname); - } - - var p = this.port ? ':' + this.port : ''; - var h = this.hostname || ''; - this.host = h + p; - this.href += this.host; - - // strip [ and ] from the hostname - // the host field still retains them, though - if (ipv6Hostname) { - this.hostname = this.hostname.substr(1, this.hostname.length - 2); - if (rest[0] !== '/') { - rest = '/' + rest; - } - } - } - - // now rest is set to the post-host stuff. - // chop off any delim chars. - if (!unsafeProtocol[lowerProto]) { - - // First, make 100% sure that any "autoEscape" chars get - // escaped, even if encodeURIComponent doesn't think they - // need to be. - for (var i = 0, l = autoEscape.length; i < l; i++) { - var ae = autoEscape[i]; - if (rest.indexOf(ae) === -1) - continue; - var esc = encodeURIComponent(ae); - if (esc === ae) { - esc = escape(ae); - } - rest = rest.split(ae).join(esc); - } - } - - - // chop off from the tail first. - var hash = rest.indexOf('#'); - if (hash !== -1) { - // got a fragment string. - this.hash = rest.substr(hash); - rest = rest.slice(0, hash); - } - var qm = rest.indexOf('?'); - if (qm !== -1) { - this.search = rest.substr(qm); - this.query = rest.substr(qm + 1); - if (parseQueryString) { - this.query = querystring.parse(this.query); - } - rest = rest.slice(0, qm); - } else if (parseQueryString) { - // no query string, but parseQueryString still requested - this.search = ''; - this.query = {}; - } - if (rest) this.pathname = rest; - if (slashedProtocol[lowerProto] && - this.hostname && !this.pathname) { - this.pathname = '/'; - } - - //to support http.request - if (this.pathname || this.search) { - var p = this.pathname || ''; - var s = this.search || ''; - this.path = p + s; - } - - // finally, reconstruct the href based on what has been validated. - this.href = this.format(); - return this; -}; - -// format a parsed object into a url string -function urlFormat(obj) { - // ensure it's an object, and not a string url. - // If it's an obj, this is a no-op. - // this way, you can call url_format() on strings - // to clean up potentially wonky urls. - if (util.isString(obj)) obj = urlParse(obj); - if (!(obj instanceof Url)) return Url.prototype.format.call(obj); - return obj.format(); -} - -Url.prototype.format = function() { - var auth = this.auth || ''; - if (auth) { - auth = encodeURIComponent(auth); - auth = auth.replace(/%3A/i, ':'); - auth += '@'; - } - - var protocol = this.protocol || '', - pathname = this.pathname || '', - hash = this.hash || '', - host = false, - query = ''; - - if (this.host) { - host = auth + this.host; - } else if (this.hostname) { - host = auth + (this.hostname.indexOf(':') === -1 ? - this.hostname : - '[' + this.hostname + ']'); - if (this.port) { - host += ':' + this.port; - } - } - - if (this.query && - util.isObject(this.query) && - Object.keys(this.query).length) { - query = querystring.stringify(this.query); - } - - var search = this.search || (query && ('?' + query)) || ''; - - if (protocol && protocol.substr(-1) !== ':') protocol += ':'; - - // only the slashedProtocols get the //. Not mailto:, xmpp:, etc. - // unless they had them to begin with. - if (this.slashes || - (!protocol || slashedProtocol[protocol]) && host !== false) { - host = '//' + (host || ''); - if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname; - } else if (!host) { - host = ''; - } - - if (hash && hash.charAt(0) !== '#') hash = '#' + hash; - if (search && search.charAt(0) !== '?') search = '?' + search; - - pathname = pathname.replace(/[?#]/g, function(match) { - return encodeURIComponent(match); - }); - search = search.replace('#', '%23'); - - return protocol + host + pathname + search + hash; -}; - -function urlResolve(source, relative) { - return urlParse(source, false, true).resolve(relative); -} - -Url.prototype.resolve = function(relative) { - return this.resolveObject(urlParse(relative, false, true)).format(); -}; - -function urlResolveObject(source, relative) { - if (!source) return relative; - return urlParse(source, false, true).resolveObject(relative); -} - -Url.prototype.resolveObject = function(relative) { - if (util.isString(relative)) { - var rel = new Url(); - rel.parse(relative, false, true); - relative = rel; - } - - var result = new Url(); - var tkeys = Object.keys(this); - for (var tk = 0; tk < tkeys.length; tk++) { - var tkey = tkeys[tk]; - result[tkey] = this[tkey]; - } - - // hash is always overridden, no matter what. - // even href="" will remove it. - result.hash = relative.hash; - - // if the relative url is empty, then there's nothing left to do here. - if (relative.href === '') { - result.href = result.format(); - return result; - } - - // hrefs like //foo/bar always cut to the protocol. - if (relative.slashes && !relative.protocol) { - // take everything except the protocol from relative - var rkeys = Object.keys(relative); - for (var rk = 0; rk < rkeys.length; rk++) { - var rkey = rkeys[rk]; - if (rkey !== 'protocol') - result[rkey] = relative[rkey]; - } - - //urlParse appends trailing / to urls like http://www.example.com - if (slashedProtocol[result.protocol] && - result.hostname && !result.pathname) { - result.path = result.pathname = '/'; - } - - result.href = result.format(); - return result; - } - - if (relative.protocol && relative.protocol !== result.protocol) { - // if it's a known url protocol, then changing - // the protocol does weird things - // first, if it's not file:, then we MUST have a host, - // and if there was a path - // to begin with, then we MUST have a path. - // if it is file:, then the host is dropped, - // because that's known to be hostless. - // anything else is assumed to be absolute. - if (!slashedProtocol[relative.protocol]) { - var keys = Object.keys(relative); - for (var v = 0; v < keys.length; v++) { - var k = keys[v]; - result[k] = relative[k]; - } - result.href = result.format(); - return result; - } - - result.protocol = relative.protocol; - if (!relative.host && !hostlessProtocol[relative.protocol]) { - var relPath = (relative.pathname || '').split('/'); - while (relPath.length && !(relative.host = relPath.shift())); - if (!relative.host) relative.host = ''; - if (!relative.hostname) relative.hostname = ''; - if (relPath[0] !== '') relPath.unshift(''); - if (relPath.length < 2) relPath.unshift(''); - result.pathname = relPath.join('/'); - } else { - result.pathname = relative.pathname; - } - result.search = relative.search; - result.query = relative.query; - result.host = relative.host || ''; - result.auth = relative.auth; - result.hostname = relative.hostname || relative.host; - result.port = relative.port; - // to support http.request - if (result.pathname || result.search) { - var p = result.pathname || ''; - var s = result.search || ''; - result.path = p + s; - } - result.slashes = result.slashes || relative.slashes; - result.href = result.format(); - return result; - } - - var isSourceAbs = (result.pathname && result.pathname.charAt(0) === '/'), - isRelAbs = ( - relative.host || - relative.pathname && relative.pathname.charAt(0) === '/' - ), - mustEndAbs = (isRelAbs || isSourceAbs || - (result.host && relative.pathname)), - removeAllDots = mustEndAbs, - srcPath = result.pathname && result.pathname.split('/') || [], - relPath = relative.pathname && relative.pathname.split('/') || [], - psychotic = result.protocol && !slashedProtocol[result.protocol]; - - // if the url is a non-slashed url, then relative - // links like ../.. should be able - // to crawl up to the hostname, as well. This is strange. - // result.protocol has already been set by now. - // Later on, put the first path part into the host field. - if (psychotic) { - result.hostname = ''; - result.port = null; - if (result.host) { - if (srcPath[0] === '') srcPath[0] = result.host; - else srcPath.unshift(result.host); - } - result.host = ''; - if (relative.protocol) { - relative.hostname = null; - relative.port = null; - if (relative.host) { - if (relPath[0] === '') relPath[0] = relative.host; - else relPath.unshift(relative.host); - } - relative.host = null; - } - mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === ''); - } - - if (isRelAbs) { - // it's absolute. - result.host = (relative.host || relative.host === '') ? - relative.host : result.host; - result.hostname = (relative.hostname || relative.hostname === '') ? - relative.hostname : result.hostname; - result.search = relative.search; - result.query = relative.query; - srcPath = relPath; - // fall through to the dot-handling below. - } else if (relPath.length) { - // it's relative - // throw away the existing file, and take the new path instead. - if (!srcPath) srcPath = []; - srcPath.pop(); - srcPath = srcPath.concat(relPath); - result.search = relative.search; - result.query = relative.query; - } else if (!util.isNullOrUndefined(relative.search)) { - // just pull out the search. - // like href='?foo'. - // Put this after the other two cases because it simplifies the booleans - if (psychotic) { - result.hostname = result.host = srcPath.shift(); - //occationaly the auth can get stuck only in host - //this especially happens in cases like - //url.resolveObject('mailto:local1@domain1', 'local2@domain2') - var authInHost = result.host && result.host.indexOf('@') > 0 ? - result.host.split('@') : false; - if (authInHost) { - result.auth = authInHost.shift(); - result.host = result.hostname = authInHost.shift(); - } - } - result.search = relative.search; - result.query = relative.query; - //to support http.request - if (!util.isNull(result.pathname) || !util.isNull(result.search)) { - result.path = (result.pathname ? result.pathname : '') + - (result.search ? result.search : ''); - } - result.href = result.format(); - return result; - } - - if (!srcPath.length) { - // no path at all. easy. - // we've already handled the other stuff above. - result.pathname = null; - //to support http.request - if (result.search) { - result.path = '/' + result.search; - } else { - result.path = null; - } - result.href = result.format(); - return result; - } - - // if a url ENDs in . or .., then it must get a trailing slash. - // however, if it ends in anything else non-slashy, - // then it must NOT get a trailing slash. - var last = srcPath.slice(-1)[0]; - var hasTrailingSlash = ( - (result.host || relative.host || srcPath.length > 1) && - (last === '.' || last === '..') || last === ''); - - // strip single dots, resolve double dots to parent dir - // if the path tries to go above the root, `up` ends up > 0 - var up = 0; - for (var i = srcPath.length; i >= 0; i--) { - last = srcPath[i]; - if (last === '.') { - srcPath.splice(i, 1); - } else if (last === '..') { - srcPath.splice(i, 1); - up++; - } else if (up) { - srcPath.splice(i, 1); - up--; - } - } - - // if the path is allowed to go above the root, restore leading ..s - if (!mustEndAbs && !removeAllDots) { - for (; up--; up) { - srcPath.unshift('..'); - } - } - - if (mustEndAbs && srcPath[0] !== '' && - (!srcPath[0] || srcPath[0].charAt(0) !== '/')) { - srcPath.unshift(''); - } - - if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) { - srcPath.push(''); - } - - var isAbsolute = srcPath[0] === '' || - (srcPath[0] && srcPath[0].charAt(0) === '/'); - - // put the host back - if (psychotic) { - result.hostname = result.host = isAbsolute ? '' : - srcPath.length ? srcPath.shift() : ''; - //occationaly the auth can get stuck only in host - //this especially happens in cases like - //url.resolveObject('mailto:local1@domain1', 'local2@domain2') - var authInHost = result.host && result.host.indexOf('@') > 0 ? - result.host.split('@') : false; - if (authInHost) { - result.auth = authInHost.shift(); - result.host = result.hostname = authInHost.shift(); - } - } - - mustEndAbs = mustEndAbs || (result.host && srcPath.length); - - if (mustEndAbs && !isAbsolute) { - srcPath.unshift(''); - } - - if (!srcPath.length) { - result.pathname = null; - result.path = null; - } else { - result.pathname = srcPath.join('/'); - } - - //to support request.http - if (!util.isNull(result.pathname) || !util.isNull(result.search)) { - result.path = (result.pathname ? result.pathname : '') + - (result.search ? result.search : ''); - } - result.auth = relative.auth || result.auth; - result.slashes = result.slashes || relative.slashes; - result.href = result.format(); - return result; -}; - -Url.prototype.parseHost = function() { - var host = this.host; - var port = portPattern.exec(host); - if (port) { - port = port[0]; - if (port !== ':') { - this.port = port.substr(1); - } - host = host.substr(0, host.length - port.length); - } - if (host) this.hostname = host; -}; - -},{"punycode":"oWqx","./util":"YsIc","querystring":"fk5h"}],"iC5B":[function(require,module,exports) { -function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function (obj) { return typeof obj; }; } else { _typeof = function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } - -/* eslint-env browser */ -module.exports = (typeof self === "undefined" ? "undefined" : _typeof(self)) == 'object' ? self.FormData : window.FormData; -},{}],"V7fS":[function(require,module,exports) { -"use strict"; - -function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } - -function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } - -function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } - -function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } - -function _wrapNativeSuper(Class) { var _cache = typeof Map === "function" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== "function") { throw new TypeError("Super expression must either be null or a function"); } if (typeof _cache !== "undefined") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); } - -function isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } - -function _construct(Parent, args, Class) { if (isNativeReflectConstruct()) { _construct = Reflect.construct; } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); } - -function _isNativeFunction(fn) { return Function.toString.call(fn).indexOf("[native code]") !== -1; } - -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } - -function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } - -Object.defineProperty(exports, "__esModule", { - value: true -}); -/** -* @ignore -*/ - -exports.ERROR_CODES = { - MISSING_PARAMETER: 'missing_parameter', - REMOTE_SERVICE_ERROR: 'remote_service_error', - INVALID_STATE: 'invalid_state', - NO_SESSION_DATA: 'no_session_data', - UNKNOWN: 'unknown' -}; -Object.freeze(exports.ERROR_CODES); -/** -* @ignore -*/ - -var BlockstackError = -/*#__PURE__*/ -function (_Error) { - _inherits(BlockstackError, _Error); - - function BlockstackError(error) { - var _this; - - _classCallCheck(this, BlockstackError); - - _this = _possibleConstructorReturn(this, _getPrototypeOf(BlockstackError).call(this, error.message)); - _this.message = error.message; - _this.code = error.code; - _this.parameter = error.parameter ? error.parameter : null; - return _this; - } - - _createClass(BlockstackError, [{ - key: "toString", - value: function toString() { - return "".concat(_get(_getPrototypeOf(BlockstackError.prototype), "toString", this).call(this), "\n code: ").concat(this.code, " param: ").concat(this.parameter ? this.parameter : 'n/a'); - } - }]); - - return BlockstackError; -}(_wrapNativeSuper(Error)); - -exports.BlockstackError = BlockstackError; -/** -* @ignore -*/ - -var FileNotFound = -/*#__PURE__*/ -function (_BlockstackError) { - _inherits(FileNotFound, _BlockstackError); - - function FileNotFound(message) { - var _this2; - - _classCallCheck(this, FileNotFound); - - _this2 = _possibleConstructorReturn(this, _getPrototypeOf(FileNotFound).call(this, { - message: message, - code: 'file_not_found' - })); - _this2.name = 'FileNotFound'; - return _this2; - } - - return FileNotFound; -}(BlockstackError); - -exports.FileNotFound = FileNotFound; -/** -* @ignore -*/ - -var InvalidParameterError = -/*#__PURE__*/ -function (_BlockstackError2) { - _inherits(InvalidParameterError, _BlockstackError2); - - function InvalidParameterError(parameter) { - var _this3; - - var message = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - - _classCallCheck(this, InvalidParameterError); - - _this3 = _possibleConstructorReturn(this, _getPrototypeOf(InvalidParameterError).call(this, { - code: 'missing_parameter', - message: message, - parameter: '' - })); - _this3.name = 'MissingParametersError'; - return _this3; - } - - return InvalidParameterError; -}(BlockstackError); - -exports.InvalidParameterError = InvalidParameterError; -/** -* @ignore -*/ - -var MissingParameterError = -/*#__PURE__*/ -function (_BlockstackError3) { - _inherits(MissingParameterError, _BlockstackError3); - - function MissingParameterError(parameter) { - var _this4; - - var message = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - - _classCallCheck(this, MissingParameterError); - - _this4 = _possibleConstructorReturn(this, _getPrototypeOf(MissingParameterError).call(this, { - code: exports.ERROR_CODES.MISSING_PARAMETER, - message: message, - parameter: parameter - })); - _this4.name = 'MissingParametersError'; - return _this4; - } - - return MissingParameterError; -}(BlockstackError); - -exports.MissingParameterError = MissingParameterError; -/** -* @ignore -*/ - -var RemoteServiceError = -/*#__PURE__*/ -function (_BlockstackError4) { - _inherits(RemoteServiceError, _BlockstackError4); - - function RemoteServiceError(response) { - var _this5; - - var message = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - - _classCallCheck(this, RemoteServiceError); - - _this5 = _possibleConstructorReturn(this, _getPrototypeOf(RemoteServiceError).call(this, { - code: exports.ERROR_CODES.REMOTE_SERVICE_ERROR, - message: message - })); - _this5.response = response; - return _this5; - } - - return RemoteServiceError; -}(BlockstackError); - -exports.RemoteServiceError = RemoteServiceError; -/** -* @ignore -*/ - -var InvalidDIDError = -/*#__PURE__*/ -function (_BlockstackError5) { - _inherits(InvalidDIDError, _BlockstackError5); - - function InvalidDIDError() { - var _this6; - - var message = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; - - _classCallCheck(this, InvalidDIDError); - - _this6 = _possibleConstructorReturn(this, _getPrototypeOf(InvalidDIDError).call(this, { - code: 'invalid_did_error', - message: message - })); - _this6.name = 'InvalidDIDError'; - return _this6; - } - - return InvalidDIDError; -}(BlockstackError); - -exports.InvalidDIDError = InvalidDIDError; -/** -* @ignore -*/ - -var NotEnoughFundsError = -/*#__PURE__*/ -function (_BlockstackError6) { - _inherits(NotEnoughFundsError, _BlockstackError6); - - function NotEnoughFundsError(leftToFund) { - var _this7; - - _classCallCheck(this, NotEnoughFundsError); - - var message = "Not enough UTXOs to fund. Left to fund: ".concat(leftToFund); - _this7 = _possibleConstructorReturn(this, _getPrototypeOf(NotEnoughFundsError).call(this, { - code: 'not_enough_error', - message: message - })); - _this7.leftToFund = leftToFund; - _this7.name = 'NotEnoughFundsError'; - _this7.message = message; - return _this7; - } - - return NotEnoughFundsError; -}(BlockstackError); - -exports.NotEnoughFundsError = NotEnoughFundsError; -/** -* @ignore -*/ - -var InvalidAmountError = -/*#__PURE__*/ -function (_BlockstackError7) { - _inherits(InvalidAmountError, _BlockstackError7); - - function InvalidAmountError(fees, specifiedAmount) { - var _this8; - - _classCallCheck(this, InvalidAmountError); - - var message = "Not enough coin to fund fees transaction fees. Fees would be ".concat(fees, ",") + " specified spend is ".concat(specifiedAmount); - _this8 = _possibleConstructorReturn(this, _getPrototypeOf(InvalidAmountError).call(this, { - code: 'invalid_amount_error', - message: message - })); - _this8.specifiedAmount = specifiedAmount; - _this8.fees = fees; - _this8.name = 'InvalidAmountError'; - _this8.message = message; - return _this8; - } - - return InvalidAmountError; -}(BlockstackError); - -exports.InvalidAmountError = InvalidAmountError; -/** -* @ignore -*/ - -var LoginFailedError = -/*#__PURE__*/ -function (_BlockstackError8) { - _inherits(LoginFailedError, _BlockstackError8); - - function LoginFailedError(reason) { - var _this9; - - _classCallCheck(this, LoginFailedError); - - var message = "Failed to login: ".concat(reason); - _this9 = _possibleConstructorReturn(this, _getPrototypeOf(LoginFailedError).call(this, { - code: 'login_failed', - message: message - })); - _this9.message = message; - _this9.name = 'LoginFailedError'; - return _this9; - } - - return LoginFailedError; -}(BlockstackError); - -exports.LoginFailedError = LoginFailedError; -/** -* @ignore -*/ - -var SignatureVerificationError = -/*#__PURE__*/ -function (_BlockstackError9) { - _inherits(SignatureVerificationError, _BlockstackError9); - - function SignatureVerificationError(reason) { - var _this10; - - _classCallCheck(this, SignatureVerificationError); - - var message = "Failed to verify signature: ".concat(reason); - _this10 = _possibleConstructorReturn(this, _getPrototypeOf(SignatureVerificationError).call(this, { - code: 'signature_verification_failure', - message: message - })); - _this10.message = message; - _this10.name = 'SignatureVerificationError'; - return _this10; - } - - return SignatureVerificationError; -}(BlockstackError); - -exports.SignatureVerificationError = SignatureVerificationError; -/** -* @ignore -*/ - -var InvalidStateError = -/*#__PURE__*/ -function (_BlockstackError10) { - _inherits(InvalidStateError, _BlockstackError10); - - function InvalidStateError(message) { - var _this11; - - _classCallCheck(this, InvalidStateError); - - _this11 = _possibleConstructorReturn(this, _getPrototypeOf(InvalidStateError).call(this, { - code: exports.ERROR_CODES.INVALID_STATE, - message: message - })); - _this11.message = message; - _this11.name = 'InvalidStateError'; - return _this11; - } - - return InvalidStateError; -}(BlockstackError); - -exports.InvalidStateError = InvalidStateError; -/** -* @ignore -*/ - -var NoSessionDataError = -/*#__PURE__*/ -function (_BlockstackError11) { - _inherits(NoSessionDataError, _BlockstackError11); - - function NoSessionDataError(message) { - var _this12; - - _classCallCheck(this, NoSessionDataError); - - _this12 = _possibleConstructorReturn(this, _getPrototypeOf(NoSessionDataError).call(this, { - code: exports.ERROR_CODES.INVALID_STATE, - message: message - })); - _this12.message = message; - _this12.name = 'NoSessionDataError'; - return _this12; - } - - return NoSessionDataError; -}(BlockstackError); - -exports.NoSessionDataError = NoSessionDataError; -},{}],"qjRs":[function(require,module,exports) { -"use strict"; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var config_1 = require("./config"); - -var levels = ['debug', 'info', 'warn', 'error', 'none']; -var levelToInt = {}; -var intToLevel = {}; - -for (var index = 0; index < levels.length; index++) { - var level = levels[index]; - levelToInt[level] = index; - intToLevel[index] = level; -} -/** -* @ignore -*/ - - -var Logger = -/*#__PURE__*/ -function () { - function Logger() { - _classCallCheck(this, Logger); - } - - _createClass(Logger, null, [{ - key: "error", - value: function error(message) { - if (!this.shouldLog('error')) return; - console.error(this.logMessage('error', message)); - } - }, { - key: "warn", - value: function warn(message) { - if (!this.shouldLog('warn')) return; - console.warn(this.logMessage('warn', message)); - } - }, { - key: "info", - value: function info(message) { - if (!this.shouldLog('info')) return; - console.log(this.logMessage('info', message)); - } - }, { - key: "debug", - value: function debug(message) { - if (!this.shouldLog('debug')) return; - console.log(this.logMessage('debug', message)); - } - }, { - key: "logMessage", - value: function logMessage(level, message) { - return "[".concat(level.toUpperCase(), "] ").concat(message); - } - }, { - key: "shouldLog", - value: function shouldLog(level) { - var currentLevel = levelToInt[config_1.config.logLevel]; - return currentLevel <= levelToInt[level]; - } - }]); - - return Logger; -}(); - -exports.Logger = Logger; -},{"./config":"GmrD"}],"bSeT":[function(require,module,exports) { -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -/** @ignore */ - -function fetchPrivate(input, init) { - init = init || {}; - init.referrerPolicy = 'no-referrer'; - return fetch(input, init); -} - -exports.fetchPrivate = fetchPrivate; -},{}],"Si1t":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -"use strict"; - -function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } - -function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } - -function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } - -function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } - -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } - -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } - -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } - -function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var bitcoinjs_lib_1 = require("bitcoinjs-lib"); - -var FormData = require("form-data"); // @ts-ignore - - -var BN = require("bn.js"); - -var RIPEMD160 = require("ripemd160"); - -var errors_1 = require("./errors"); - -var logger_1 = require("./logger"); - -var config_1 = require("./config"); - -var fetchUtil_1 = require("./fetchUtil"); - -var SATOSHIS_PER_BTC = 1e8; -var TX_BROADCAST_SERVICE_ZONE_FILE_ENDPOINT = 'zone-file'; -var TX_BROADCAST_SERVICE_REGISTRATION_ENDPOINT = 'registration'; -var TX_BROADCAST_SERVICE_TX_ENDPOINT = 'transaction'; -/** - * @private - * @ignore - */ - -var BitcoinNetwork = -/*#__PURE__*/ -function () { - function BitcoinNetwork() { - _classCallCheck(this, BitcoinNetwork); - } - - _createClass(BitcoinNetwork, [{ - key: "broadcastTransaction", - value: function broadcastTransaction(transaction) { - return Promise.reject(new Error("Not implemented, broadcastTransaction(".concat(transaction, ")"))); - } - }, { - key: "getBlockHeight", - value: function getBlockHeight() { - return Promise.reject(new Error('Not implemented, getBlockHeight()')); - } - }, { - key: "getTransactionInfo", - value: function getTransactionInfo(txid) { - return Promise.reject(new Error("Not implemented, getTransactionInfo(".concat(txid, ")"))); - } - }, { - key: "getNetworkedUTXOs", - value: function getNetworkedUTXOs(address) { - return Promise.reject(new Error("Not implemented, getNetworkedUTXOs(".concat(address, ")"))); - } - }]); - - return BitcoinNetwork; -}(); - -exports.BitcoinNetwork = BitcoinNetwork; -/** - * @private - * @ignore - */ - -var BlockstackNetwork = -/*#__PURE__*/ -function () { - function BlockstackNetwork(apiUrl, broadcastServiceUrl, bitcoinAPI) { - var network = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : bitcoinjs_lib_1.networks.bitcoin; - - _classCallCheck(this, BlockstackNetwork); - - this.blockstackAPIUrl = apiUrl; - this.broadcastServiceUrl = broadcastServiceUrl; - this.layer1 = network; - this.btc = bitcoinAPI; - this.DUST_MINIMUM = 5500; - this.includeUtxoMap = {}; - this.excludeUtxoSet = []; - this.MAGIC_BYTES = 'id'; - } - - _createClass(BlockstackNetwork, [{ - key: "coerceAddress", - value: function coerceAddress(address) { - var _bitcoinjs_lib_1$addr = bitcoinjs_lib_1.address.fromBase58Check(address), - hash = _bitcoinjs_lib_1$addr.hash, - version = _bitcoinjs_lib_1$addr.version; - - var scriptHashes = [bitcoinjs_lib_1.networks.bitcoin.scriptHash, bitcoinjs_lib_1.networks.testnet.scriptHash]; - var pubKeyHashes = [bitcoinjs_lib_1.networks.bitcoin.pubKeyHash, bitcoinjs_lib_1.networks.testnet.pubKeyHash]; - var coercedVersion; - - if (scriptHashes.indexOf(version) >= 0) { - coercedVersion = this.layer1.scriptHash; - } else if (pubKeyHashes.indexOf(version) >= 0) { - coercedVersion = this.layer1.pubKeyHash; - } else { - throw new Error("Unrecognized address version number ".concat(version, " in ").concat(address)); - } - - return bitcoinjs_lib_1.address.toBase58Check(hash, coercedVersion); - } - /** - * @ignore - */ - - }, { - key: "getDefaultBurnAddress", - value: function getDefaultBurnAddress() { - return this.coerceAddress('1111111111111111111114oLvT2'); - } - /** - * Get the price of a name via the legacy /v1/prices API endpoint. - * @param {String} fullyQualifiedName the name to query - * @return {Promise} a promise to an Object with { units: String, amount: BigInteger } - * @private - */ - - }, { - key: "getNamePriceV1", - value: function getNamePriceV1(fullyQualifiedName) { - var _this = this; - - // legacy code path - return fetchUtil_1.fetchPrivate("".concat(this.blockstackAPIUrl, "/v1/prices/names/").concat(fullyQualifiedName)).then(function (resp) { - if (!resp.ok) { - throw new Error("Failed to query name price for ".concat(fullyQualifiedName)); - } - - return resp; - }).then(function (resp) { - return resp.json(); - }).then(function (resp) { - return resp.name_price; - }).then(function (namePrice) { - if (!namePrice || !namePrice.satoshis) { - throw new Error("Failed to get price for ".concat(fullyQualifiedName, ". Does the namespace exist?")); - } - - if (namePrice.satoshis < _this.DUST_MINIMUM) { - namePrice.satoshis = _this.DUST_MINIMUM; - } - - var result = { - units: 'BTC', - amount: new BN(String(namePrice.satoshis)) - }; - return result; - }); - } - /** - * Get the price of a namespace via the legacy /v1/prices API endpoint. - * @param {String} namespaceID the namespace to query - * @return {Promise} a promise to an Object with { units: String, amount: BigInteger } - * @private - */ - - }, { - key: "getNamespacePriceV1", - value: function getNamespacePriceV1(namespaceID) { - var _this2 = this; - - // legacy code path - return fetchUtil_1.fetchPrivate("".concat(this.blockstackAPIUrl, "/v1/prices/namespaces/").concat(namespaceID)).then(function (resp) { - if (!resp.ok) { - throw new Error("Failed to query name price for ".concat(namespaceID)); - } - - return resp; - }).then(function (resp) { - return resp.json(); - }).then(function (namespacePrice) { - if (!namespacePrice || !namespacePrice.satoshis) { - throw new Error("Failed to get price for ".concat(namespaceID)); - } - - if (namespacePrice.satoshis < _this2.DUST_MINIMUM) { - namespacePrice.satoshis = _this2.DUST_MINIMUM; - } - - var result = { - units: 'BTC', - amount: new BN(String(namespacePrice.satoshis)) - }; - return result; - }); - } - /** - * Get the price of a name via the /v2/prices API endpoint. - * @param {String} fullyQualifiedName the name to query - * @return {Promise} a promise to an Object with { units: String, amount: BigInteger } - * @private - */ - - }, { - key: "getNamePriceV2", - value: function getNamePriceV2(fullyQualifiedName) { - var _this3 = this; - - return fetchUtil_1.fetchPrivate("".concat(this.blockstackAPIUrl, "/v2/prices/names/").concat(fullyQualifiedName)).then(function (resp) { - if (resp.status !== 200) { - // old core node - throw new Error('The upstream node does not handle the /v2/ price namespace'); - } - - return resp; - }).then(function (resp) { - return resp.json(); - }).then(function (resp) { - return resp.name_price; - }).then(function (namePrice) { - if (!namePrice) { - throw new Error("Failed to get price for ".concat(fullyQualifiedName, ". Does the namespace exist?")); - } - - var result = { - units: namePrice.units, - amount: new BN(namePrice.amount) - }; - - if (namePrice.units === 'BTC') { - // must be at least dust-minimum - var dustMin = new BN(String(_this3.DUST_MINIMUM)); - - if (result.amount.ucmp(dustMin) < 0) { - result.amount = dustMin; - } - } - - return result; - }); - } - /** - * Get the price of a namespace via the /v2/prices API endpoint. - * @param {String} namespaceID the namespace to query - * @return {Promise} a promise to an Object with { units: String, amount: BigInteger } - * @private - */ - - }, { - key: "getNamespacePriceV2", - value: function getNamespacePriceV2(namespaceID) { - var _this4 = this; - - return fetchUtil_1.fetchPrivate("".concat(this.blockstackAPIUrl, "/v2/prices/namespaces/").concat(namespaceID)).then(function (resp) { - if (resp.status !== 200) { - // old core node - throw new Error('The upstream node does not handle the /v2/ price namespace'); - } - - return resp; - }).then(function (resp) { - return resp.json(); - }).then(function (namespacePrice) { - if (!namespacePrice) { - throw new Error("Failed to get price for ".concat(namespaceID)); - } - - var result = { - units: namespacePrice.units, - amount: new BN(namespacePrice.amount) - }; - - if (namespacePrice.units === 'BTC') { - // must be at least dust-minimum - var dustMin = new BN(String(_this4.DUST_MINIMUM)); - - if (result.amount.ucmp(dustMin) < 0) { - result.amount = dustMin; - } - } - - return result; - }); - } - /** - * Get the price of a name. - * @param {String} fullyQualifiedName the name to query - * @return {Promise} a promise to an Object with { units: String, amount: BigInteger }, where - * .units encodes the cryptocurrency units to pay (e.g. BTC, STACKS), and - * .amount encodes the number of units, in the smallest denominiated amount - * (e.g. if .units is BTC, .amount will be satoshis; if .units is STACKS, - * .amount will be microStacks) - */ - - }, { - key: "getNamePrice", - value: function getNamePrice(fullyQualifiedName) { - var _this5 = this; - - // handle v1 or v2 - return Promise.resolve().then(function () { - return _this5.getNamePriceV2(fullyQualifiedName); - }).catch(function () { - return _this5.getNamePriceV1(fullyQualifiedName); - }); - } - /** - * Get the price of a namespace - * @param {String} namespaceID the namespace to query - * @return {Promise} a promise to an Object with { units: String, amount: BigInteger }, where - * .units encodes the cryptocurrency units to pay (e.g. BTC, STACKS), and - * .amount encodes the number of units, in the smallest denominiated amount - * (e.g. if .units is BTC, .amount will be satoshis; if .units is STACKS, - * .amount will be microStacks) - */ - - }, { - key: "getNamespacePrice", - value: function getNamespacePrice(namespaceID) { - var _this6 = this; - - // handle v1 or v2 - return Promise.resolve().then(function () { - return _this6.getNamespacePriceV2(namespaceID); - }).catch(function () { - return _this6.getNamespacePriceV1(namespaceID); - }); - } - /** - * How many blocks can pass between a name expiring and the name being able to be - * re-registered by a different owner? - * @param {string} fullyQualifiedName unused - * @return {Promise} a promise to the number of blocks - */ - - }, { - key: "getGracePeriod", - value: function getGracePeriod(fullyQualifiedName) { - return Promise.resolve(5000); - } - /** - * Get the names -- both on-chain and off-chain -- owned by an address. - * @param {String} address the blockchain address (the hash of the owner public key) - * @return {Promise} a promise that resolves to a list of names (Strings) - */ - - }, { - key: "getNamesOwned", - value: function getNamesOwned(address) { - var networkAddress = this.coerceAddress(address); - return fetchUtil_1.fetchPrivate("".concat(this.blockstackAPIUrl, "/v1/addresses/bitcoin/").concat(networkAddress)).then(function (resp) { - return resp.json(); - }).then(function (obj) { - return obj.names; - }); - } - /** - * Get the blockchain address to which a name's registration fee must be sent - * (the address will depend on the namespace in which it is registered.) - * @param {String} namespace the namespace ID - * @return {Promise} a promise that resolves to an address (String) - */ - - }, { - key: "getNamespaceBurnAddress", - value: function getNamespaceBurnAddress(namespace) { - var _this7 = this; - - return Promise.all([fetchUtil_1.fetchPrivate("".concat(this.blockstackAPIUrl, "/v1/namespaces/").concat(namespace)), this.getBlockHeight()]).then(function (_ref) { - var _ref2 = _slicedToArray(_ref, 2), - resp = _ref2[0], - blockHeight = _ref2[1]; - - if (resp.status === 404) { - throw new Error("No such namespace '".concat(namespace, "'")); - } else { - return Promise.all([resp.json(), blockHeight]); - } - }).then(function (_ref3) { - var _ref4 = _slicedToArray(_ref3, 2), - namespaceInfo = _ref4[0], - blockHeight = _ref4[1]; - - var address = _this7.getDefaultBurnAddress(); - - if (namespaceInfo.version === 2) { - // pay-to-namespace-creator if this namespace is less than 1 year old - if (namespaceInfo.reveal_block + 52595 >= blockHeight) { - address = namespaceInfo.address; - } - } - - return address; - }).then(function (address) { - return _this7.coerceAddress(address); - }); - } - /** - * Get WHOIS-like information for a name, including the address that owns it, - * the block at which it expires, and the zone file anchored to it (if available). - * @param {String} fullyQualifiedName the name to query. Can be on-chain of off-chain. - * @return {Promise} a promise that resolves to the WHOIS-like information - */ - - }, { - key: "getNameInfo", - value: function getNameInfo(fullyQualifiedName) { - var _this8 = this; - - logger_1.Logger.debug(this.blockstackAPIUrl); - var nameLookupURL = "".concat(this.blockstackAPIUrl, "/v1/names/").concat(fullyQualifiedName); - return fetchUtil_1.fetchPrivate(nameLookupURL).then(function (resp) { - if (resp.status === 404) { - throw new Error('Name not found'); - } else if (resp.status !== 200) { - throw new Error("Bad response status: ".concat(resp.status)); - } else { - return resp.json(); - } - }).then(function (nameInfo) { - logger_1.Logger.debug("nameInfo: ".concat(JSON.stringify(nameInfo))); // the returned address _should_ be in the correct network --- - // blockstackd gets into trouble because it tries to coerce back to mainnet - // and the regtest transaction generation libraries want to use testnet addresses - - if (nameInfo.address) { - return Object.assign({}, nameInfo, { - address: _this8.coerceAddress(nameInfo.address) - }); - } else { - return nameInfo; - } - }); - } - /** - * Get the pricing parameters and creation history of a namespace. - * @param {String} namespaceID the namespace to query - * @return {Promise} a promise that resolves to the namespace information. - */ - - }, { - key: "getNamespaceInfo", - value: function getNamespaceInfo(namespaceID) { - var _this9 = this; - - return fetchUtil_1.fetchPrivate("".concat(this.blockstackAPIUrl, "/v1/namespaces/").concat(namespaceID)).then(function (resp) { - if (resp.status === 404) { - throw new Error('Namespace not found'); - } else if (resp.status !== 200) { - throw new Error("Bad response status: ".concat(resp.status)); - } else { - return resp.json(); - } - }).then(function (namespaceInfo) { - // the returned address _should_ be in the correct network --- - // blockstackd gets into trouble because it tries to coerce back to mainnet - // and the regtest transaction generation libraries want to use testnet addresses - if (namespaceInfo.address && namespaceInfo.recipient_address) { - return Object.assign({}, namespaceInfo, { - address: _this9.coerceAddress(namespaceInfo.address), - recipient_address: _this9.coerceAddress(namespaceInfo.recipient_address) - }); - } else { - return namespaceInfo; - } - }); - } - /** - * Get a zone file, given its hash. Throws an exception if the zone file - * obtained does not match the hash. - * @param {String} zonefileHash the ripemd160(sha256) hash of the zone file - * @return {Promise} a promise that resolves to the zone file's text - */ - - }, { - key: "getZonefile", - value: function getZonefile(zonefileHash) { - return fetchUtil_1.fetchPrivate("".concat(this.blockstackAPIUrl, "/v1/zonefiles/").concat(zonefileHash)).then(function (resp) { - if (resp.status === 200) { - return resp.text().then(function (body) { - var sha256 = bitcoinjs_lib_1.crypto.sha256(Buffer.from(body)); - var h = new RIPEMD160().update(sha256).digest('hex'); - - if (h !== zonefileHash) { - throw new Error("Zone file contents hash to ".concat(h, ", not ").concat(zonefileHash)); - } - - return body; - }); - } else { - throw new Error("Bad response status: ".concat(resp.status)); - } - }); - } - /** - * Get the status of an account for a particular token holding. This includes its total number of - * expenditures and credits, lockup times, last txid, and so on. - * @param {String} address the account - * @param {String} tokenType the token type to query - * @return {Promise} a promise that resolves to an object representing the state of the account - * for this token - */ - - }, { - key: "getAccountStatus", - value: function getAccountStatus(address, tokenType) { - var _this10 = this; - - return fetchUtil_1.fetchPrivate("".concat(this.blockstackAPIUrl, "/v1/accounts/").concat(address, "/").concat(tokenType, "/status")).then(function (resp) { - if (resp.status === 404) { - throw new Error('Account not found'); - } else if (resp.status !== 200) { - throw new Error("Bad response status: ".concat(resp.status)); - } else { - return resp.json(); - } - }).then(function (accountStatus) { - // coerce all addresses, and convert credit/debit to biginteger - var formattedStatus = Object.assign({}, accountStatus, { - address: _this10.coerceAddress(accountStatus.address), - debit_value: new BN(String(accountStatus.debit_value)), - credit_value: new BN(String(accountStatus.credit_value)) - }); - return formattedStatus; - }); - } - /** - * Get a page of an account's transaction history. - * @param {String} address the account's address - * @param {number} page the page number. Page 0 is the most recent transactions - * @return {Promise} a promise that resolves to an Array of Objects, where each Object encodes - * states of the account at various block heights (e.g. prior balances, txids, etc) - */ - - }, { - key: "getAccountHistoryPage", - value: function getAccountHistoryPage(address, page) { - var _this11 = this; - - var url = "".concat(this.blockstackAPIUrl, "/v1/accounts/").concat(address, "/history?page=").concat(page); - return fetchUtil_1.fetchPrivate(url).then(function (resp) { - if (resp.status === 404) { - throw new Error('Account not found'); - } else if (resp.status !== 200) { - throw new Error("Bad response status: ".concat(resp.status)); - } else { - return resp.json(); - } - }).then(function (historyList) { - if (historyList.error) { - throw new Error("Unable to get account history page: ".concat(historyList.error)); - } // coerse all addresses and convert to bigint - - - return historyList.map(function (histEntry) { - histEntry.address = _this11.coerceAddress(histEntry.address); - histEntry.debit_value = new BN(String(histEntry.debit_value)); - histEntry.credit_value = new BN(String(histEntry.credit_value)); - return histEntry; - }); - }); - } - /** - * Get the state(s) of an account at a particular block height. This includes the state of the - * account beginning with this block's transactions, as well as all of the states the account - * passed through when this block was processed (if any). - * @param {String} address the account's address - * @param {Integer} blockHeight the block to query - * @return {Promise} a promise that resolves to an Array of Objects, where each Object encodes - * states of the account at this block. - */ - - }, { - key: "getAccountAt", - value: function getAccountAt(address, blockHeight) { - var _this12 = this; - - var url = "".concat(this.blockstackAPIUrl, "/v1/accounts/").concat(address, "/history/").concat(blockHeight); - return fetchUtil_1.fetchPrivate(url).then(function (resp) { - if (resp.status === 404) { - throw new Error('Account not found'); - } else if (resp.status !== 200) { - throw new Error("Bad response status: ".concat(resp.status)); - } else { - return resp.json(); - } - }).then(function (historyList) { - if (historyList.error) { - throw new Error("Unable to get historic account state: ".concat(historyList.error)); - } // coerce all addresses - - - return historyList.map(function (histEntry) { - histEntry.address = _this12.coerceAddress(histEntry.address); - histEntry.debit_value = new BN(String(histEntry.debit_value)); - histEntry.credit_value = new BN(String(histEntry.credit_value)); - return histEntry; - }); - }); - } - /** - * Get the set of token types that this account owns - * @param {String} address the account's address - * @return {Promise} a promise that resolves to an Array of Strings, where each item encodes the - * type of token this account holds (excluding the underlying blockchain's tokens) - */ - - }, { - key: "getAccountTokens", - value: function getAccountTokens(address) { - return fetchUtil_1.fetchPrivate("".concat(this.blockstackAPIUrl, "/v1/accounts/").concat(address, "/tokens")).then(function (resp) { - if (resp.status === 404) { - throw new Error('Account not found'); - } else if (resp.status !== 200) { - throw new Error("Bad response status: ".concat(resp.status)); - } else { - return resp.json(); - } - }).then(function (tokenList) { - if (tokenList.error) { - throw new Error("Unable to get token list: ".concat(tokenList.error)); - } - - return tokenList; - }); - } - /** - * Get the number of tokens owned by an account. If the account does not exist or has no - * tokens of this type, then 0 will be returned. - * @param {String} address the account's address - * @param {String} tokenType the type of token to query. - * @return {Promise} a promise that resolves to a BigInteger that encodes the number of tokens - * held by this account. - */ - - }, { - key: "getAccountBalance", - value: function getAccountBalance(address, tokenType) { - return fetchUtil_1.fetchPrivate("".concat(this.blockstackAPIUrl, "/v1/accounts/").concat(address, "/").concat(tokenType, "/balance")).then(function (resp) { - if (resp.status === 404) { - // talking to an older blockstack core node without the accounts API - return Promise.resolve().then(function () { - return new BN('0'); - }); - } else if (resp.status !== 200) { - throw new Error("Bad response status: ".concat(resp.status)); - } else { - return resp.json(); - } - }).then(function (tokenBalance) { - if (tokenBalance.error) { - throw new Error("Unable to get account balance: ".concat(tokenBalance.error)); - } - - var balance = '0'; - - if (tokenBalance && tokenBalance.balance) { - balance = tokenBalance.balance; - } - - return new BN(balance); - }); - } - /** - * Performs a POST request to the given URL - * @param {String} endpoint the name of - * @param {String} body [description] - * @return {Promise} Returns a `Promise` that resolves to the object requested. - * In the event of an error, it rejects with: - * * a `RemoteServiceError` if there is a problem - * with the transaction broadcast service - * * `MissingParameterError` if you call the function without a required - * parameter - * - * @private - */ - - }, { - key: "broadcastServiceFetchHelper", - value: function broadcastServiceFetchHelper(endpoint, body) { - var requestHeaders = { - Accept: 'application/json', - 'Content-Type': 'application/json' - }; - var options = { - method: 'POST', - headers: requestHeaders, - body: JSON.stringify(body) - }; - var url = "".concat(this.broadcastServiceUrl, "/v1/broadcast/").concat(endpoint); - return fetchUtil_1.fetchPrivate(url, options).then(function (response) { - if (response.ok) { - return response.json(); - } else { - throw new errors_1.RemoteServiceError(response); - } - }); - } - /** - * Broadcasts a signed bitcoin transaction to the network optionally waiting to broadcast the - * transaction until a second transaction has a certain number of confirmations. - * - * @param {string} transaction the hex-encoded transaction to broadcast - * @param {string} transactionToWatch the hex transaction id of the transaction to watch for - * the specified number of confirmations before broadcasting the `transaction` - * @param {number} confirmations the number of confirmations `transactionToWatch` must have - * before broadcasting `transaction`. - * @return {Promise} Returns a Promise that resolves to an object with a - * `transaction_hash` key containing the transaction hash of the broadcasted transaction. - * - * In the event of an error, it rejects with: - * * a `RemoteServiceError` if there is a problem - * with the transaction broadcast service - * * `MissingParameterError` if you call the function without a required - * parameter - * @private - */ - - }, { - key: "broadcastTransaction", - value: function broadcastTransaction(transaction) { - var transactionToWatch = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; - var confirmations = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 6; - - if (!transaction) { - var error = new errors_1.MissingParameterError('transaction'); - return Promise.reject(error); - } - - if (!confirmations && confirmations !== 0) { - var _error = new errors_1.MissingParameterError('confirmations'); - - return Promise.reject(_error); - } - - if (transactionToWatch === null) { - return this.btc.broadcastTransaction(transaction); - } else { - /* - * POST /v1/broadcast/transaction - * Request body: - * JSON.stringify({ - * transaction, - * transactionToWatch, - * confirmations - * }) - */ - var endpoint = TX_BROADCAST_SERVICE_TX_ENDPOINT; - var requestBody = { - transaction: transaction, - transactionToWatch: transactionToWatch, - confirmations: confirmations - }; - return this.broadcastServiceFetchHelper(endpoint, requestBody); - } - } - /** - * Broadcasts a zone file to the Atlas network via the transaction broadcast service. - * - * @param {String} zoneFile the zone file to be broadcast to the Atlas network - * @param {String} transactionToWatch the hex transaction id of the transaction - * to watch for confirmation before broadcasting the zone file to the Atlas network - * @return {Promise} Returns a Promise that resolves to an object with a - * `transaction_hash` key containing the transaction hash of the broadcasted transaction. - * - * In the event of an error, it rejects with: - * * a `RemoteServiceError` if there is a problem - * with the transaction broadcast service - * * `MissingParameterError` if you call the function without a required - * parameter - * @private - */ - - }, { - key: "broadcastZoneFile", - value: function broadcastZoneFile(zoneFile) { - var transactionToWatch = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; - - if (!zoneFile) { - return Promise.reject(new errors_1.MissingParameterError('zoneFile')); - } // TODO: validate zonefile - - - if (transactionToWatch) { - // broadcast via transaction broadcast service - - /* - * POST /v1/broadcast/zone-file - * Request body: - * JSON.stringify({ - * zoneFile, - * transactionToWatch - * }) - */ - var requestBody = { - zoneFile: zoneFile, - transactionToWatch: transactionToWatch - }; - var endpoint = TX_BROADCAST_SERVICE_ZONE_FILE_ENDPOINT; - return this.broadcastServiceFetchHelper(endpoint, requestBody); - } else { - // broadcast via core endpoint - // zone file is two words but core's api treats it as one word 'zonefile' - var _requestBody = { - zonefile: zoneFile - }; - return fetchUtil_1.fetchPrivate("".concat(this.blockstackAPIUrl, "/v1/zonefile/"), { - method: 'POST', - body: JSON.stringify(_requestBody), - headers: { - 'Content-Type': 'application/json' - } - }).then(function (resp) { - var json = resp.json(); - return json.then(function (respObj) { - if (respObj.hasOwnProperty('error')) { - throw new errors_1.RemoteServiceError(resp); - } - - return respObj.servers; - }); - }); - } - } - /** - * Sends the preorder and registration transactions and zone file - * for a Blockstack name registration - * along with the to the transaction broadcast service. - * - * The transaction broadcast: - * - * * immediately broadcasts the preorder transaction - * * broadcasts the register transactions after the preorder transaction - * has an appropriate number of confirmations - * * broadcasts the zone file to the Atlas network after the register transaction - * has an appropriate number of confirmations - * - * @param {String} preorderTransaction the hex-encoded, signed preorder transaction generated - * using the `makePreorder` function - * @param {String} registerTransaction the hex-encoded, signed register transaction generated - * using the `makeRegister` function - * @param {String} zoneFile the zone file to be broadcast to the Atlas network - * @return {Promise} Returns a Promise that resolves to an object with a - * `transaction_hash` key containing the transaction hash of the broadcasted transaction. - * - * In the event of an error, it rejects with: - * * a `RemoteServiceError` if there is a problem - * with the transaction broadcast service - * * `MissingParameterError` if you call the function without a required - * parameter - * @private - */ - - }, { - key: "broadcastNameRegistration", - value: function broadcastNameRegistration(preorderTransaction, registerTransaction, zoneFile) { - /* - * POST /v1/broadcast/registration - * Request body: - * JSON.stringify({ - * preorderTransaction, - * registerTransaction, - * zoneFile - * }) - */ - if (!preorderTransaction) { - var error = new errors_1.MissingParameterError('preorderTransaction'); - return Promise.reject(error); - } - - if (!registerTransaction) { - var _error2 = new errors_1.MissingParameterError('registerTransaction'); - - return Promise.reject(_error2); - } - - if (!zoneFile) { - var _error3 = new errors_1.MissingParameterError('zoneFile'); - - return Promise.reject(_error3); - } - - var requestBody = { - preorderTransaction: preorderTransaction, - registerTransaction: registerTransaction, - zoneFile: zoneFile - }; - var endpoint = TX_BROADCAST_SERVICE_REGISTRATION_ENDPOINT; - return this.broadcastServiceFetchHelper(endpoint, requestBody); - } - /** - * @ignore - */ - - }, { - key: "getFeeRate", - value: function getFeeRate() { - return fetchUtil_1.fetchPrivate('https://bitcoinfees.earn.com/api/v1/fees/recommended').then(function (resp) { - return resp.json(); - }).then(function (rates) { - return Math.floor(rates.fastestFee); - }); - } - /** - * @ignore - */ - - }, { - key: "countDustOutputs", - value: function countDustOutputs() { - throw new Error('Not implemented.'); - } - /** - * @ignore - */ - - }, { - key: "getUTXOs", - value: function getUTXOs(address) { - var _this13 = this; - - return this.getNetworkedUTXOs(address).then(function (networkedUTXOs) { - var returnSet = networkedUTXOs.concat(); - - if (_this13.includeUtxoMap.hasOwnProperty(address)) { - returnSet = networkedUTXOs.concat(_this13.includeUtxoMap[address]); - } // aaron: I am *well* aware this is O(n)*O(m) runtime - // however, clients should clear the exclude set periodically - - - var excludeSet = _this13.excludeUtxoSet; - returnSet = returnSet.filter(function (utxo) { - var inExcludeSet = excludeSet.reduce(function (inSet, utxoToCheck) { - return inSet || utxoToCheck.tx_hash === utxo.tx_hash && utxoToCheck.tx_output_n === utxo.tx_output_n; - }, false); - return !inExcludeSet; - }); - return returnSet; - }); - } - /** - * This will modify the network's utxo set to include UTXOs - * from the given transaction and exclude UTXOs *spent* in - * that transaction - * @param {String} txHex - the hex-encoded transaction to use - * @return {void} no return value, this modifies the UTXO config state - * @private - * @ignore - */ - - }, { - key: "modifyUTXOSetFrom", - value: function modifyUTXOSetFrom(txHex) { - var _this14 = this; - - var tx = bitcoinjs_lib_1.Transaction.fromHex(txHex); - var excludeSet = this.excludeUtxoSet.concat(); - tx.ins.forEach(function (utxoUsed) { - var reverseHash = Buffer.from(utxoUsed.hash); - reverseHash.reverse(); - excludeSet.push({ - tx_hash: reverseHash.toString('hex'), - tx_output_n: utxoUsed.index - }); - }); - this.excludeUtxoSet = excludeSet; - var txHash = Buffer.from(tx.getHash().reverse()).toString('hex'); - tx.outs.forEach(function (utxoCreated, txOutputN) { - var isNullData = function isNullData(script) { - try { - bitcoinjs_lib_1.payments.embed({ - output: script - }, { - validate: true - }); - return true; - } catch (_) { - return false; - } - }; - - if (isNullData(utxoCreated.script)) { - return; - } - - var address = bitcoinjs_lib_1.address.fromOutputScript(utxoCreated.script, _this14.layer1); - var includeSet = []; - - if (_this14.includeUtxoMap.hasOwnProperty(address)) { - includeSet = includeSet.concat(_this14.includeUtxoMap[address]); - } - - includeSet.push({ - tx_hash: txHash, - confirmations: 0, - value: utxoCreated.value, - tx_output_n: txOutputN - }); - _this14.includeUtxoMap[address] = includeSet; - }); - } - }, { - key: "resetUTXOs", - value: function resetUTXOs(address) { - delete this.includeUtxoMap[address]; - this.excludeUtxoSet = []; - } - /** - * @ignore - */ - - }, { - key: "getConsensusHash", - value: function getConsensusHash() { - return fetchUtil_1.fetchPrivate("".concat(this.blockstackAPIUrl, "/v1/blockchains/bitcoin/consensus")).then(function (resp) { - return resp.json(); - }).then(function (x) { - return x.consensus_hash; - }); - } - }, { - key: "getTransactionInfo", - value: function getTransactionInfo(txHash) { - return this.btc.getTransactionInfo(txHash); - } - /** - * @ignore - */ - - }, { - key: "getBlockHeight", - value: function getBlockHeight() { - return this.btc.getBlockHeight(); - } - }, { - key: "getNetworkedUTXOs", - value: function getNetworkedUTXOs(address) { - return this.btc.getNetworkedUTXOs(address); - } - }]); - - return BlockstackNetwork; -}(); - -exports.BlockstackNetwork = BlockstackNetwork; -/** - * @ignore - */ - -var LocalRegtest = -/*#__PURE__*/ -function (_BlockstackNetwork) { - _inherits(LocalRegtest, _BlockstackNetwork); - - function LocalRegtest(apiUrl, broadcastServiceUrl, bitcoinAPI) { - _classCallCheck(this, LocalRegtest); - - return _possibleConstructorReturn(this, _getPrototypeOf(LocalRegtest).call(this, apiUrl, broadcastServiceUrl, bitcoinAPI, bitcoinjs_lib_1.networks.testnet)); - } - - _createClass(LocalRegtest, [{ - key: "getFeeRate", - value: function getFeeRate() { - return Promise.resolve(Math.floor(0.00001000 * SATOSHIS_PER_BTC)); - } - }]); - - return LocalRegtest; -}(BlockstackNetwork); - -exports.LocalRegtest = LocalRegtest; -/** - * @ignore - */ - -var BitcoindAPI = -/*#__PURE__*/ -function (_BitcoinNetwork) { - _inherits(BitcoindAPI, _BitcoinNetwork); - - function BitcoindAPI(bitcoindUrl, bitcoindCredentials) { - var _this15; - - _classCallCheck(this, BitcoindAPI); - - _this15 = _possibleConstructorReturn(this, _getPrototypeOf(BitcoindAPI).call(this)); - _this15.bitcoindUrl = bitcoindUrl; - _this15.bitcoindCredentials = bitcoindCredentials; - _this15.importedBefore = {}; - return _this15; - } - - _createClass(BitcoindAPI, [{ - key: "broadcastTransaction", - value: function broadcastTransaction(transaction) { - var jsonRPC = { - jsonrpc: '1.0', - method: 'sendrawtransaction', - params: [transaction] - }; - var authString = Buffer.from("".concat(this.bitcoindCredentials.username, ":").concat(this.bitcoindCredentials.password)).toString('base64'); - var headers = { - Authorization: "Basic ".concat(authString) - }; - return fetchUtil_1.fetchPrivate(this.bitcoindUrl, { - method: 'POST', - body: JSON.stringify(jsonRPC), - headers: headers - }).then(function (resp) { - return resp.json(); - }).then(function (respObj) { - return respObj.result; - }); - } - }, { - key: "getBlockHeight", - value: function getBlockHeight() { - var jsonRPC = { - jsonrpc: '1.0', - method: 'getblockcount' - }; - var authString = Buffer.from("".concat(this.bitcoindCredentials.username, ":").concat(this.bitcoindCredentials.password)).toString('base64'); - var headers = { - Authorization: "Basic ".concat(authString) - }; - return fetchUtil_1.fetchPrivate(this.bitcoindUrl, { - method: 'POST', - body: JSON.stringify(jsonRPC), - headers: headers - }).then(function (resp) { - return resp.json(); - }).then(function (respObj) { - return respObj.result; - }); - } - }, { - key: "getTransactionInfo", - value: function getTransactionInfo(txHash) { - var _this16 = this; - - var jsonRPC = { - jsonrpc: '1.0', - method: 'gettransaction', - params: [txHash] - }; - var authString = Buffer.from("".concat(this.bitcoindCredentials.username, ":").concat(this.bitcoindCredentials.password)).toString('base64'); - var headers = { - Authorization: "Basic ".concat(authString) - }; - return fetchUtil_1.fetchPrivate(this.bitcoindUrl, { - method: 'POST', - body: JSON.stringify(jsonRPC), - headers: headers - }).then(function (resp) { - return resp.json(); - }).then(function (respObj) { - return respObj.result; - }).then(function (txInfo) { - return txInfo.blockhash; - }).then(function (blockhash) { - var jsonRPCBlock = { - jsonrpc: '1.0', - method: 'getblockheader', - params: [blockhash] - }; - headers.Authorization = "Basic ".concat(authString); - return fetchUtil_1.fetchPrivate(_this16.bitcoindUrl, { - method: 'POST', - body: JSON.stringify(jsonRPCBlock), - headers: headers - }); - }).then(function (resp) { - return resp.json(); - }).then(function (respObj) { - if (!respObj || !respObj.result) { - // unconfirmed - throw new Error('Unconfirmed transaction'); - } else { - return { - block_height: respObj.result.height - }; - } - }); - } - }, { - key: "getNetworkedUTXOs", - value: function getNetworkedUTXOs(address) { - var _this17 = this; - - var jsonRPCImport = { - jsonrpc: '1.0', - method: 'importaddress', - params: [address] - }; - var jsonRPCUnspent = { - jsonrpc: '1.0', - method: 'listunspent', - params: [0, 9999999, [address]] - }; - var authString = Buffer.from("".concat(this.bitcoindCredentials.username, ":").concat(this.bitcoindCredentials.password)).toString('base64'); - var headers = { - Authorization: "Basic ".concat(authString) - }; - var importPromise = this.importedBefore[address] ? Promise.resolve() : fetchUtil_1.fetchPrivate(this.bitcoindUrl, { - method: 'POST', - body: JSON.stringify(jsonRPCImport), - headers: headers - }).then(function () { - _this17.importedBefore[address] = true; - }); - return importPromise.then(function () { - return fetchUtil_1.fetchPrivate(_this17.bitcoindUrl, { - method: 'POST', - body: JSON.stringify(jsonRPCUnspent), - headers: headers - }); - }).then(function (resp) { - return resp.json(); - }).then(function (x) { - return x.result; - }).then(function (utxos) { - return utxos.map(function (x) { - return { - value: Math.round(x.amount * SATOSHIS_PER_BTC), - confirmations: x.confirmations, - tx_hash: x.txid, - tx_output_n: x.vout - }; - }); - }); - } - }]); - - return BitcoindAPI; -}(BitcoinNetwork); - -exports.BitcoindAPI = BitcoindAPI; -/** - * @ignore - */ - -var InsightClient = -/*#__PURE__*/ -function (_BitcoinNetwork2) { - _inherits(InsightClient, _BitcoinNetwork2); - - function InsightClient() { - var _this18; - - var insightUrl = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'https://utxo.technofractal.com/'; - - _classCallCheck(this, InsightClient); - - _this18 = _possibleConstructorReturn(this, _getPrototypeOf(InsightClient).call(this)); - _this18.apiUrl = insightUrl; - return _this18; - } - - _createClass(InsightClient, [{ - key: "broadcastTransaction", - value: function broadcastTransaction(transaction) { - var jsonData = { - rawtx: transaction - }; - return fetchUtil_1.fetchPrivate("".concat(this.apiUrl, "/tx/send"), { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify(jsonData) - }).then(function (resp) { - return resp.json(); - }); - } - }, { - key: "getBlockHeight", - value: function getBlockHeight() { - return fetchUtil_1.fetchPrivate("".concat(this.apiUrl, "/status")).then(function (resp) { - return resp.json(); - }).then(function (status) { - return status.blocks; - }); - } - }, { - key: "getTransactionInfo", - value: function getTransactionInfo(txHash) { - var _this19 = this; - - return fetchUtil_1.fetchPrivate("".concat(this.apiUrl, "/tx/").concat(txHash)).then(function (resp) { - return resp.json(); - }).then(function (transactionInfo) { - if (transactionInfo.error) { - throw new Error("Error finding transaction: ".concat(transactionInfo.error)); - } - - return fetchUtil_1.fetchPrivate("".concat(_this19.apiUrl, "/block/").concat(transactionInfo.blockHash)); - }).then(function (resp) { - return resp.json(); - }).then(function (blockInfo) { - return { - block_height: blockInfo.height - }; - }); - } - }, { - key: "getNetworkedUTXOs", - value: function getNetworkedUTXOs(address) { - return fetchUtil_1.fetchPrivate("".concat(this.apiUrl, "/addr/").concat(address, "/utxo")).then(function (resp) { - return resp.json(); - }).then(function (utxos) { - return utxos.map(function (x) { - return { - value: x.satoshis, - confirmations: x.confirmations, - tx_hash: x.txid, - tx_output_n: x.vout - }; - }); - }); - } - }]); - - return InsightClient; -}(BitcoinNetwork); - -exports.InsightClient = InsightClient; -/** - * @ignore - */ - -var BlockchainInfoApi = -/*#__PURE__*/ -function (_BitcoinNetwork3) { - _inherits(BlockchainInfoApi, _BitcoinNetwork3); - - function BlockchainInfoApi() { - var _this20; - - var blockchainInfoUrl = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'https://blockchain.info'; - - _classCallCheck(this, BlockchainInfoApi); - - _this20 = _possibleConstructorReturn(this, _getPrototypeOf(BlockchainInfoApi).call(this)); - _this20.utxoProviderUrl = blockchainInfoUrl; - return _this20; - } - - _createClass(BlockchainInfoApi, [{ - key: "getBlockHeight", - value: function getBlockHeight() { - return fetchUtil_1.fetchPrivate("".concat(this.utxoProviderUrl, "/latestblock?cors=true")).then(function (resp) { - return resp.json(); - }).then(function (blockObj) { - return blockObj.height; - }); - } - }, { - key: "getNetworkedUTXOs", - value: function getNetworkedUTXOs(address) { - return fetchUtil_1.fetchPrivate("".concat(this.utxoProviderUrl, "/unspent?format=json&active=").concat(address, "&cors=true")).then(function (resp) { - if (resp.status === 500) { - logger_1.Logger.debug('UTXO provider 500 usually means no UTXOs: returning []'); - return { - unspent_outputs: [] - }; - } else { - return resp.json(); - } - }).then(function (utxoJSON) { - return utxoJSON.unspent_outputs; - }).then(function (utxoList) { - return utxoList.map(function (utxo) { - var utxoOut = { - value: utxo.value, - tx_output_n: utxo.tx_output_n, - confirmations: utxo.confirmations, - tx_hash: utxo.tx_hash_big_endian - }; - return utxoOut; - }); - }); - } - }, { - key: "getTransactionInfo", - value: function getTransactionInfo(txHash) { - return fetchUtil_1.fetchPrivate("".concat(this.utxoProviderUrl, "/rawtx/").concat(txHash, "?cors=true")).then(function (resp) { - if (resp.status === 200) { - return resp.json(); - } else { - throw new Error("Could not lookup transaction info for '".concat(txHash, "'. Server error.")); - } - }).then(function (respObj) { - return { - block_height: respObj.block_height - }; - }); - } - }, { - key: "broadcastTransaction", - value: function broadcastTransaction(transaction) { - var form = new FormData(); - form.append('tx', transaction); - return fetchUtil_1.fetchPrivate("".concat(this.utxoProviderUrl, "/pushtx?cors=true"), { - method: 'POST', - body: form - }).then(function (resp) { - var text = resp.text(); - return text.then(function (respText) { - if (respText.toLowerCase().indexOf('transaction submitted') >= 0) { - var txHash = Buffer.from(bitcoinjs_lib_1.Transaction.fromHex(transaction).getHash().reverse()).toString('hex'); // big_endian - - return txHash; - } else { - throw new errors_1.RemoteServiceError(resp, "Broadcast transaction failed with message: ".concat(respText)); - } - }); - }); - } - }]); - - return BlockchainInfoApi; -}(BitcoinNetwork); - -exports.BlockchainInfoApi = BlockchainInfoApi; -/** -* @ignore -*/ - -var LOCAL_REGTEST = new LocalRegtest('http://localhost:16268', 'http://localhost:16269', new BitcoindAPI('http://localhost:18332/', { - username: 'blockstack', - password: 'blockstacksystem' -})); -/** -* @ignore -*/ - -var MAINNET_DEFAULT = new BlockstackNetwork('https://core.blockstack.org', 'https://broadcast.blockstack.org', new BlockchainInfoApi()); -/** - * Get WHOIS-like information for a name, including the address that owns it, - * the block at which it expires, and the zone file anchored to it (if available). - * @param {String} fullyQualifiedName the name to query. Can be on-chain of off-chain. - * @return {Promise} a promise that resolves to the WHOIS-like information - */ - -function getNameInfo(fullyQualifiedName) { - return config_1.config.network.getNameInfo(fullyQualifiedName); -} - -exports.getNameInfo = getNameInfo; -/** -* @ignore -*/ - -exports.network = { - BlockstackNetwork: BlockstackNetwork, - LocalRegtest: LocalRegtest, - BlockchainInfoApi: BlockchainInfoApi, - BitcoindAPI: BitcoindAPI, - InsightClient: InsightClient, - defaults: { - LOCAL_REGTEST: LOCAL_REGTEST, - MAINNET_DEFAULT: MAINNET_DEFAULT - } -}; -},{"bitcoinjs-lib":"bZOe","form-data":"iC5B","bn.js":"BOxy","ripemd160":"quyi","./errors":"V7fS","./logger":"qjRs","./config":"GmrD","./fetchUtil":"bSeT","buffer":"dskh"}],"GmrD":[function(require,module,exports) { -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var network_1 = require("./network"); -/** -* @ignore -*/ - - -var config = { - network: network_1.network.defaults.MAINNET_DEFAULT, - logLevel: 'debug' -}; -exports.config = config; -},{"./network":"Si1t"}],"dEjD":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -var global = arguments[3]; -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var url = require("url"); - -var bitcoinjs_lib_1 = require("bitcoinjs-lib"); - -var config_1 = require("./config"); - -var logger_1 = require("./logger"); -/** - * @ignore - */ - - -exports.BLOCKSTACK_HANDLER = 'blockstack'; -/** - * Time - * @private - * @ignore - */ - -function nextYear() { - return new Date(new Date().setFullYear(new Date().getFullYear() + 1)); -} - -exports.nextYear = nextYear; -/** - * Time - * @private - * @ignore - */ - -function nextMonth() { - return new Date(new Date().setMonth(new Date().getMonth() + 1)); -} - -exports.nextMonth = nextMonth; -/** - * Time - * @private - * @ignore - */ - -function nextHour() { - return new Date(new Date().setHours(new Date().getHours() + 1)); -} - -exports.nextHour = nextHour; -/** - * Query Strings - * @private - * @ignore - */ - -function updateQueryStringParameter(uri, key, value) { - var re = new RegExp("([?&])".concat(key, "=.*?(&|$)"), 'i'); - var separator = uri.indexOf('?') !== -1 ? '&' : '?'; - - if (uri.match(re)) { - return uri.replace(re, "$1".concat(key, "=").concat(value, "$2")); - } else { - return "".concat(uri).concat(separator).concat(key, "=").concat(value); - } -} - -exports.updateQueryStringParameter = updateQueryStringParameter; -/** - * Versioning - * @param {string} v1 - the left half of the version inequality - * @param {string} v2 - right half of the version inequality - * @returns {bool} iff v1 >= v2 - * @private - * @ignore - */ - -function isLaterVersion(v1, v2) { - if (v1 === undefined) { - v1 = '0.0.0'; - } - - if (v2 === undefined) { - v2 = '0.0.0'; - } - - var v1tuple = v1.split('.').map(function (x) { - return parseInt(x, 10); - }); - var v2tuple = v2.split('.').map(function (x) { - return parseInt(x, 10); - }); - - for (var index = 0; index < v2.length; index++) { - if (index >= v1.length) { - v2tuple.push(0); - } - - if (v1tuple[index] < v2tuple[index]) { - return false; - } - } - - return true; -} - -exports.isLaterVersion = isLaterVersion; -/** - * Time - * @private - * @ignore - */ - -function hexStringToECPair(skHex) { - var ecPairOptions = { - network: config_1.config.network.layer1, - compressed: true - }; - - if (skHex.length === 66) { - if (skHex.slice(64) !== '01') { - throw new Error('Improperly formatted private-key hex string. 66-length hex usually ' + 'indicates compressed key, but last byte must be == 1'); - } - - return bitcoinjs_lib_1.ECPair.fromPrivateKey(Buffer.from(skHex.slice(0, 64), 'hex'), ecPairOptions); - } else if (skHex.length === 64) { - ecPairOptions.compressed = false; - return bitcoinjs_lib_1.ECPair.fromPrivateKey(Buffer.from(skHex, 'hex'), ecPairOptions); - } else { - throw new Error('Improperly formatted private-key hex string: length should be 64 or 66.'); - } -} - -exports.hexStringToECPair = hexStringToECPair; -/** - * - * @ignore - */ - -function ecPairToHexString(secretKey) { - var ecPointHex = secretKey.privateKey.toString('hex'); - - if (secretKey.compressed) { - return "".concat(ecPointHex, "01"); - } else { - return ecPointHex; - } -} - -exports.ecPairToHexString = ecPairToHexString; -/** - * Time - * @private - * @ignore - */ - -function ecPairToAddress(keyPair) { - return bitcoinjs_lib_1.address.toBase58Check(bitcoinjs_lib_1.crypto.hash160(keyPair.publicKey), keyPair.network.pubKeyHash); -} - -exports.ecPairToAddress = ecPairToAddress; -/** - * UUIDs - * @private - * @ignore - */ - -function makeUUID4() { - var d = new Date().getTime(); - - if (typeof performance !== 'undefined' && typeof performance.now === 'function') { - d += performance.now(); // use high-precision timer if available - } - - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { - var r = (d + Math.random() * 16) % 16 | 0; - d = Math.floor(d / 16); - return (c === 'x' ? r : r & 0x3 | 0x8).toString(16); - }); -} - -exports.makeUUID4 = makeUUID4; -/** - * Checks if both urls pass the same origin check & are absolute - * @param {[type]} uri1 first uri to check - * @param {[type]} uri2 second uri to check - * @return {Boolean} true if they pass the same origin check - * @private - * @ignore - */ - -function isSameOriginAbsoluteUrl(uri1, uri2) { - var parsedUri1 = url.parse(uri1); - var parsedUri2 = url.parse(uri2); - var port1 = parseInt(parsedUri1.port || '0', 10) | 0 || (parsedUri1.protocol === 'https:' ? 443 : 80); - var port2 = parseInt(parsedUri2.port || '0', 10) | 0 || (parsedUri2.protocol === 'https:' ? 443 : 80); - var match = { - scheme: parsedUri1.protocol === parsedUri2.protocol, - hostname: parsedUri1.hostname === parsedUri2.hostname, - port: port1 === port2, - absolute: (uri1.includes('http://') || uri1.includes('https://')) && (uri2.includes('http://') || uri2.includes('https://')) - }; - return match.scheme && match.hostname && match.port && match.absolute; -} - -exports.isSameOriginAbsoluteUrl = isSameOriginAbsoluteUrl; -/** - * Returns the global scope `Window`, `WorkerGlobalScope`, or `NodeJS.Global` if available in the - * currently executing environment. - * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/self - * @see https://developer.mozilla.org/en-US/docs/Web/API/WorkerGlobalScope/self - * @see https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope - * - * This could be switched to `globalThis` once it is standardized and widely available. - * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/globalThis - */ - -function getGlobalScope() { - if (typeof self !== 'undefined') { - return self; - } - - if (typeof window !== 'undefined') { - return window; - } // This function is meant to be called when accessing APIs that are typically only available in - // web-browser/DOM environments, but we also want to support situations where running in Node.js - // environment, and a polyfill was added to the Node.js `global` object scope without adding the - // `window` global object as well. - - - if (typeof global !== 'undefined') { - return global; - } - - throw new Error('Unexpected runtime environment - no supported global scope (`window`, `self`, `global`) available'); -} - -function getAPIUsageErrorMessage(scopeObject, apiName, usageDesc) { - if (usageDesc) { - return "Use of '".concat(usageDesc, "' requires `").concat(apiName, "` which is unavailable on the '").concat(scopeObject, "' object within the currently executing environment."); - } else { - return "`".concat(apiName, "` is unavailable on the '").concat(scopeObject, "' object within the currently executing environment."); - } -} -/** - * Returns an object from the global scope (`Window` or `WorkerGlobalScope`) if it - * is available within the currently executing environment. - * When executing within the Node.js runtime these APIs are unavailable and will be - * `undefined` unless the API is provided via polyfill. - * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/self - * @ignore - */ - - -function getGlobalObject(name) { - var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - throwIfUnavailable = _ref.throwIfUnavailable, - usageDesc = _ref.usageDesc, - returnEmptyObject = _ref.returnEmptyObject; - - var globalScope; - - try { - globalScope = getGlobalScope(); - - if (globalScope) { - var obj = globalScope[name]; - - if (obj) { - return obj; - } - } - } catch (error) { - logger_1.Logger.error("Error getting object '".concat(name, "' from global scope '").concat(globalScope, "': ").concat(error)); - } - - if (throwIfUnavailable) { - var errMsg = getAPIUsageErrorMessage(globalScope, name.toString(), usageDesc); - logger_1.Logger.error(errMsg); - throw new Error(errMsg); - } - - if (returnEmptyObject) { - return {}; - } - - return undefined; -} - -exports.getGlobalObject = getGlobalObject; -/** - * Returns a specified subset of objects from the global scope (`Window` or `WorkerGlobalScope`) - * if they are available within the currently executing environment. - * When executing within the Node.js runtime these APIs are unavailable will be `undefined` - * unless the API is provided via polyfill. - * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/self - * @ignore - */ - -function getGlobalObjects(names) { - var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - throwIfUnavailable = _ref2.throwIfUnavailable, - usageDesc = _ref2.usageDesc, - returnEmptyObject = _ref2.returnEmptyObject; - - var globalScope; - - try { - globalScope = getGlobalScope(); - } catch (error) { - logger_1.Logger.error("Error getting global scope: ".concat(error)); - - if (throwIfUnavailable) { - var errMsg = getAPIUsageErrorMessage(globalScope, names[0].toString(), usageDesc); - logger_1.Logger.error(errMsg); - throw errMsg; - } else if (returnEmptyObject) { - globalScope = {}; - } - } - - var result = {}; - - for (var i = 0; i < names.length; i++) { - var name = names[i]; - - try { - if (globalScope) { - var obj = globalScope[name]; - - if (obj) { - result[name] = obj; - } else if (throwIfUnavailable) { - var _errMsg = getAPIUsageErrorMessage(globalScope, name.toString(), usageDesc); - - logger_1.Logger.error(_errMsg); - throw new Error(_errMsg); - } else if (returnEmptyObject) { - result[name] = {}; - } - } - } catch (error) { - if (throwIfUnavailable) { - var _errMsg2 = getAPIUsageErrorMessage(globalScope, name.toString(), usageDesc); - - logger_1.Logger.error(_errMsg2); - throw new Error(_errMsg2); - } - } - } - - return result; -} - -exports.getGlobalObjects = getGlobalObjects; -},{"url":"Mej7","bitcoinjs-lib":"bZOe","./config":"GmrD","./logger":"qjRs","buffer":"dskh"}],"k09H":[function(require,module,exports) { -"use strict"; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var authConstants_1 = require("./authConstants"); - -var utils_1 = require("../utils"); -/** - * Configuration data for the current app. - * - * On browser platforms, creating an instance of this - * class without any arguments will use - * `window.location.origin` as the app domain. - * On non-browser platforms, you need to - * specify an app domain as the second argument. - * - */ - - -var AppConfig = -/*#__PURE__*/ -function () { - /** - * @param {Array} scopes - permissions this app is requesting - * @param {string} appDomain - the app domain - * @param {string} redirectPath - path on app domain to redirect users to after authentication - * @param {string} manifestPath - path relative to app domain of app's manifest file - * @param {string} coreNode - override the default or user selected core node - * @param {string} authenticatorURL - the web-based fall back authenticator - * ([[DEFAULT_BLOCKSTACK_HOST]]) - */ - function AppConfig() { - var scopes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : authConstants_1.DEFAULT_SCOPE.slice(); - var appDomain = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : utils_1.getGlobalObject('location', { - returnEmptyObject: true - }).origin; - var redirectPath = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; - var manifestPath = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '/manifest.json'; - var coreNode = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null; - var authenticatorURL = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : authConstants_1.DEFAULT_BLOCKSTACK_HOST; - - _classCallCheck(this, AppConfig); - - this.appDomain = appDomain; - this.scopes = scopes; - this.redirectPath = redirectPath; - this.manifestPath = manifestPath; - - if (!coreNode) { - this.coreNode = authConstants_1.DEFAULT_CORE_NODE; - } else { - this.coreNode = coreNode; - } - - this.authenticatorURL = authenticatorURL; - } - /** - * The location to which the authenticator should - * redirect the user. - * @returns {string} - URI - */ - - - _createClass(AppConfig, [{ - key: "redirectURI", - value: function redirectURI() { - return "".concat(this.appDomain).concat(this.redirectPath); - } - /** - * The location of the app's manifest file. - * @returns {string} - URI - */ - - }, { - key: "manifestURI", - value: function manifestURI() { - return "".concat(this.appDomain).concat(this.manifestPath); - } - }]); - - return AppConfig; -}(); - -exports.AppConfig = AppConfig; -},{"./authConstants":"UTxZ","../utils":"dEjD"}],"CQH0":[function(require,module,exports) { -(function(self) { - - if (self.fetch) { - return - } - - var support = { - searchParams: 'URLSearchParams' in self, - iterable: 'Symbol' in self && 'iterator' in Symbol, - blob: 'FileReader' in self && 'Blob' in self && (function() { - try { - new Blob(); - return true - } catch(e) { - return false - } - })(), - formData: 'FormData' in self, - arrayBuffer: 'ArrayBuffer' in self - }; - - if (support.arrayBuffer) { - var viewClasses = [ - '[object Int8Array]', - '[object Uint8Array]', - '[object Uint8ClampedArray]', - '[object Int16Array]', - '[object Uint16Array]', - '[object Int32Array]', - '[object Uint32Array]', - '[object Float32Array]', - '[object Float64Array]' - ]; - - var isDataView = function(obj) { - return obj && DataView.prototype.isPrototypeOf(obj) - }; - - var isArrayBufferView = ArrayBuffer.isView || function(obj) { - return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1 - }; - } - - function normalizeName(name) { - if (typeof name !== 'string') { - name = String(name); - } - if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) { - throw new TypeError('Invalid character in header field name') - } - return name.toLowerCase() - } - - function normalizeValue(value) { - if (typeof value !== 'string') { - value = String(value); - } - return value - } - - // Build a destructive iterator for the value list - function iteratorFor(items) { - var iterator = { - next: function() { - var value = items.shift(); - return {done: value === undefined, value: value} - } - }; - - if (support.iterable) { - iterator[Symbol.iterator] = function() { - return iterator - }; - } - - return iterator - } - - function Headers(headers) { - this.map = {}; - - if (headers instanceof Headers) { - headers.forEach(function(value, name) { - this.append(name, value); - }, this); - } else if (Array.isArray(headers)) { - headers.forEach(function(header) { - this.append(header[0], header[1]); - }, this); - } else if (headers) { - Object.getOwnPropertyNames(headers).forEach(function(name) { - this.append(name, headers[name]); - }, this); - } - } - - Headers.prototype.append = function(name, value) { - name = normalizeName(name); - value = normalizeValue(value); - var oldValue = this.map[name]; - this.map[name] = oldValue ? oldValue+','+value : value; - }; - - Headers.prototype['delete'] = function(name) { - delete this.map[normalizeName(name)]; - }; - - Headers.prototype.get = function(name) { - name = normalizeName(name); - return this.has(name) ? this.map[name] : null - }; - - Headers.prototype.has = function(name) { - return this.map.hasOwnProperty(normalizeName(name)) - }; - - Headers.prototype.set = function(name, value) { - this.map[normalizeName(name)] = normalizeValue(value); - }; - - Headers.prototype.forEach = function(callback, thisArg) { - for (var name in this.map) { - if (this.map.hasOwnProperty(name)) { - callback.call(thisArg, this.map[name], name, this); - } - } - }; - - Headers.prototype.keys = function() { - var items = []; - this.forEach(function(value, name) { items.push(name); }); - return iteratorFor(items) - }; - - Headers.prototype.values = function() { - var items = []; - this.forEach(function(value) { items.push(value); }); - return iteratorFor(items) - }; - - Headers.prototype.entries = function() { - var items = []; - this.forEach(function(value, name) { items.push([name, value]); }); - return iteratorFor(items) - }; - - if (support.iterable) { - Headers.prototype[Symbol.iterator] = Headers.prototype.entries; - } - - function consumed(body) { - if (body.bodyUsed) { - return Promise.reject(new TypeError('Already read')) - } - body.bodyUsed = true; - } - - function fileReaderReady(reader) { - return new Promise(function(resolve, reject) { - reader.onload = function() { - resolve(reader.result); - }; - reader.onerror = function() { - reject(reader.error); - }; - }) - } - - function readBlobAsArrayBuffer(blob) { - var reader = new FileReader(); - var promise = fileReaderReady(reader); - reader.readAsArrayBuffer(blob); - return promise - } - - function readBlobAsText(blob) { - var reader = new FileReader(); - var promise = fileReaderReady(reader); - reader.readAsText(blob); - return promise - } - - function readArrayBufferAsText(buf) { - var view = new Uint8Array(buf); - var chars = new Array(view.length); - - for (var i = 0; i < view.length; i++) { - chars[i] = String.fromCharCode(view[i]); - } - return chars.join('') - } - - function bufferClone(buf) { - if (buf.slice) { - return buf.slice(0) - } else { - var view = new Uint8Array(buf.byteLength); - view.set(new Uint8Array(buf)); - return view.buffer - } - } - - function Body() { - this.bodyUsed = false; - - this._initBody = function(body) { - this._bodyInit = body; - if (!body) { - this._bodyText = ''; - } else if (typeof body === 'string') { - this._bodyText = body; - } else if (support.blob && Blob.prototype.isPrototypeOf(body)) { - this._bodyBlob = body; - } else if (support.formData && FormData.prototype.isPrototypeOf(body)) { - this._bodyFormData = body; - } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { - this._bodyText = body.toString(); - } else if (support.arrayBuffer && support.blob && isDataView(body)) { - this._bodyArrayBuffer = bufferClone(body.buffer); - // IE 10-11 can't handle a DataView body. - this._bodyInit = new Blob([this._bodyArrayBuffer]); - } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) { - this._bodyArrayBuffer = bufferClone(body); - } else { - throw new Error('unsupported BodyInit type') - } - - if (!this.headers.get('content-type')) { - if (typeof body === 'string') { - this.headers.set('content-type', 'text/plain;charset=UTF-8'); - } else if (this._bodyBlob && this._bodyBlob.type) { - this.headers.set('content-type', this._bodyBlob.type); - } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { - this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8'); - } - } - }; - - if (support.blob) { - this.blob = function() { - var rejected = consumed(this); - if (rejected) { - return rejected - } - - if (this._bodyBlob) { - return Promise.resolve(this._bodyBlob) - } else if (this._bodyArrayBuffer) { - return Promise.resolve(new Blob([this._bodyArrayBuffer])) - } else if (this._bodyFormData) { - throw new Error('could not read FormData body as blob') - } else { - return Promise.resolve(new Blob([this._bodyText])) - } - }; - - this.arrayBuffer = function() { - if (this._bodyArrayBuffer) { - return consumed(this) || Promise.resolve(this._bodyArrayBuffer) - } else { - return this.blob().then(readBlobAsArrayBuffer) - } - }; - } - - this.text = function() { - var rejected = consumed(this); - if (rejected) { - return rejected - } - - if (this._bodyBlob) { - return readBlobAsText(this._bodyBlob) - } else if (this._bodyArrayBuffer) { - return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer)) - } else if (this._bodyFormData) { - throw new Error('could not read FormData body as text') - } else { - return Promise.resolve(this._bodyText) - } - }; - - if (support.formData) { - this.formData = function() { - return this.text().then(decode) - }; - } - - this.json = function() { - return this.text().then(JSON.parse) - }; - - return this - } - - // HTTP methods whose capitalization should be normalized - var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']; - - function normalizeMethod(method) { - var upcased = method.toUpperCase(); - return (methods.indexOf(upcased) > -1) ? upcased : method - } - - function Request(input, options) { - options = options || {}; - var body = options.body; - - if (input instanceof Request) { - if (input.bodyUsed) { - throw new TypeError('Already read') - } - this.url = input.url; - this.credentials = input.credentials; - if (!options.headers) { - this.headers = new Headers(input.headers); - } - this.method = input.method; - this.mode = input.mode; - if (!body && input._bodyInit != null) { - body = input._bodyInit; - input.bodyUsed = true; - } - } else { - this.url = String(input); - } - - this.credentials = options.credentials || this.credentials || 'omit'; - if (options.headers || !this.headers) { - this.headers = new Headers(options.headers); - } - this.method = normalizeMethod(options.method || this.method || 'GET'); - this.mode = options.mode || this.mode || null; - this.referrer = null; - - if ((this.method === 'GET' || this.method === 'HEAD') && body) { - throw new TypeError('Body not allowed for GET or HEAD requests') - } - this._initBody(body); - } - - Request.prototype.clone = function() { - return new Request(this, { body: this._bodyInit }) - }; - - function decode(body) { - var form = new FormData(); - body.trim().split('&').forEach(function(bytes) { - if (bytes) { - var split = bytes.split('='); - var name = split.shift().replace(/\+/g, ' '); - var value = split.join('=').replace(/\+/g, ' '); - form.append(decodeURIComponent(name), decodeURIComponent(value)); - } - }); - return form - } - - function parseHeaders(rawHeaders) { - var headers = new Headers(); - // Replace instances of \r\n and \n followed by at least one space or horizontal tab with a space - // https://tools.ietf.org/html/rfc7230#section-3.2 - var preProcessedHeaders = rawHeaders.replace(/\r?\n[\t ]+/g, ' '); - preProcessedHeaders.split(/\r?\n/).forEach(function(line) { - var parts = line.split(':'); - var key = parts.shift().trim(); - if (key) { - var value = parts.join(':').trim(); - headers.append(key, value); - } - }); - return headers - } - - Body.call(Request.prototype); - - function Response(bodyInit, options) { - if (!options) { - options = {}; - } - - this.type = 'default'; - this.status = options.status === undefined ? 200 : options.status; - this.ok = this.status >= 200 && this.status < 300; - this.statusText = 'statusText' in options ? options.statusText : 'OK'; - this.headers = new Headers(options.headers); - this.url = options.url || ''; - this._initBody(bodyInit); - } - - Body.call(Response.prototype); - - Response.prototype.clone = function() { - return new Response(this._bodyInit, { - status: this.status, - statusText: this.statusText, - headers: new Headers(this.headers), - url: this.url - }) - }; - - Response.error = function() { - var response = new Response(null, {status: 0, statusText: ''}); - response.type = 'error'; - return response - }; - - var redirectStatuses = [301, 302, 303, 307, 308]; - - Response.redirect = function(url, status) { - if (redirectStatuses.indexOf(status) === -1) { - throw new RangeError('Invalid status code') - } - - return new Response(null, {status: status, headers: {location: url}}) - }; - - self.Headers = Headers; - self.Request = Request; - self.Response = Response; - - self.fetch = function(input, init) { - return new Promise(function(resolve, reject) { - var request = new Request(input, init); - var xhr = new XMLHttpRequest(); - - xhr.onload = function() { - var options = { - status: xhr.status, - statusText: xhr.statusText, - headers: parseHeaders(xhr.getAllResponseHeaders() || '') - }; - options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL'); - var body = 'response' in xhr ? xhr.response : xhr.responseText; - resolve(new Response(body, options)); - }; - - xhr.onerror = function() { - reject(new TypeError('Network request failed')); - }; - - xhr.ontimeout = function() { - reject(new TypeError('Network request failed')); - }; - - xhr.open(request.method, request.url, true); - - if (request.credentials === 'include') { - xhr.withCredentials = true; - } else if (request.credentials === 'omit') { - xhr.withCredentials = false; - } - - if ('responseType' in xhr && support.blob) { - xhr.responseType = 'blob'; - } - - request.headers.forEach(function(value, name) { - xhr.setRequestHeader(name, value); - }); - - xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit); - }) - }; - self.fetch.polyfill = true; -})(typeof self !== 'undefined' ? self : this); - -},{}],"qabb":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var crypto_1 = require("crypto"); - -var bitcoinjs_lib_1 = require("bitcoinjs-lib"); -/** - * - * @param numberOfBytes - * - * @ignore - */ - - -function getEntropy(arg) { - if (!arg) { - arg = 32; - } - - if (typeof arg === 'number') { - return crypto_1.randomBytes(arg); - } else { - return crypto_1.randomFillSync(arg); - } -} - -exports.getEntropy = getEntropy; -/** -* @ignore -*/ - -function makeECPrivateKey() { - var keyPair = bitcoinjs_lib_1.ECPair.makeRandom({ - rng: getEntropy - }); - return keyPair.privateKey.toString('hex'); -} - -exports.makeECPrivateKey = makeECPrivateKey; -/** -* @ignore -*/ - -function publicKeyToAddress(publicKey) { - var publicKeyBuffer = Buffer.from(publicKey, 'hex'); - var publicKeyHash160 = bitcoinjs_lib_1.crypto.hash160(publicKeyBuffer); - var address = bitcoinjs_lib_1.address.toBase58Check(publicKeyHash160, 0x00); - return address; -} - -exports.publicKeyToAddress = publicKeyToAddress; -/** -* @ignore -*/ - -function getPublicKeyFromPrivate(privateKey) { - var keyPair = bitcoinjs_lib_1.ECPair.fromPrivateKey(Buffer.from(privateKey, 'hex')); - return keyPair.publicKey.toString('hex'); -} - -exports.getPublicKeyFromPrivate = getPublicKeyFromPrivate; -},{"crypto":"mRF4","bitcoinjs-lib":"bZOe","buffer":"dskh"}],"oZHr":[function(require,module,exports) { -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var errors_1 = require("./errors"); -/** -* @ignore -*/ - - -function makeDIDFromAddress(address) { - return "did:btc-addr:".concat(address); -} - -exports.makeDIDFromAddress = makeDIDFromAddress; -/** -* @ignore -*/ - -function makeDIDFromPublicKey(publicKey) { - return "did:ecdsa-pub:".concat(publicKey); -} - -exports.makeDIDFromPublicKey = makeDIDFromPublicKey; -/** -* @ignore -*/ - -function getDIDType(decentralizedID) { - var didParts = decentralizedID.split(':'); - - if (didParts.length !== 3) { - throw new errors_1.InvalidDIDError('Decentralized IDs must have 3 parts'); - } - - if (didParts[0].toLowerCase() !== 'did') { - throw new errors_1.InvalidDIDError('Decentralized IDs must start with "did"'); - } - - return didParts[1].toLowerCase(); -} - -exports.getDIDType = getDIDType; -/** -* @ignore -*/ - -function getAddressFromDID(decentralizedID) { - var didType = getDIDType(decentralizedID); - - if (didType === 'btc-addr') { - return decentralizedID.split(':')[2]; - } else { - return null; - } -} - -exports.getAddressFromDID = getAddressFromDID; -/* -export function getPublicKeyOrAddressFromDID(decentralizedID) { - const didParts = decentralizedID.split(':') - - if (didParts.length !== 3) { - throw new InvalidDIDError('Decentralized IDs must have 3 parts') - } - - if (didParts[0].toLowerCase() !== 'did') { - throw new InvalidDIDError('Decentralized IDs must start with "did"') - } - - if (didParts[1].toLowerCase() === 'ecdsa-pub') { - return didParts[2] - } else if (didParts[1].toLowerCase() === 'btc-addr') { - return didParts[2] - } else { - throw new InvalidDIDError('Decentralized ID format not supported') - } -} -*/ -},{"./errors":"V7fS"}],"pXJD":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var elliptic_1 = require("elliptic"); - -var crypto = require("crypto"); - -var keys_1 = require("../keys"); - -var ecurve = new elliptic_1.ec('secp256k1'); -/** -* @ignore -*/ - -function aes256CbcEncrypt(iv, key, plaintext) { - var cipher = crypto.createCipheriv('aes-256-cbc', key, iv); - return Buffer.concat([cipher.update(plaintext), cipher.final()]); -} -/** -* @ignore -*/ - - -function aes256CbcDecrypt(iv, key, ciphertext) { - var cipher = crypto.createDecipheriv('aes-256-cbc', key, iv); - return Buffer.concat([cipher.update(ciphertext), cipher.final()]); -} -/** -* @ignore -*/ - - -function hmacSha256(key, content) { - return crypto.createHmac('sha256', key).update(content).digest(); -} -/** -* @ignore -*/ - - -function equalConstTime(b1, b2) { - if (b1.length !== b2.length) { - return false; - } - - var res = 0; - - for (var i = 0; i < b1.length; i++) { - res |= b1[i] ^ b2[i]; // jshint ignore:line - } - - return res === 0; -} -/** -* @ignore -*/ - - -function sharedSecretToKeys(sharedSecret) { - // generate mac and encryption key from shared secret - var hashedSecret = crypto.createHash('sha512').update(sharedSecret).digest(); - return { - encryptionKey: hashedSecret.slice(0, 32), - hmacKey: hashedSecret.slice(32) - }; -} -/** -* @ignore -*/ - - -function getHexFromBN(bnInput) { - var hexOut = bnInput.toString('hex'); - - if (hexOut.length === 64) { - return hexOut; - } else if (hexOut.length < 64) { - // pad with leading zeros - // the padStart function would require node 9 - var padding = '0'.repeat(64 - hexOut.length); - return "".concat(padding).concat(hexOut); - } else { - throw new Error('Generated a > 32-byte BN for encryption. Failing.'); - } -} - -exports.getHexFromBN = getHexFromBN; -/** - * Encrypt content to elliptic curve publicKey using ECIES - * @param {String} publicKey - secp256k1 public key hex string - * @param {String | Buffer} content - content to encrypt - * @return {Object} Object containing (hex encoded): - * iv (initialization vector), cipherText (cipher text), - * mac (message authentication code), ephemeral public key - * wasString (boolean indicating with or not to return a buffer or string on decrypt) - * - * @private - * @ignore - */ - -function encryptECIES(publicKey, content) { - var isString = typeof content === 'string'; // always copy to buffer - - var plainText = content instanceof Buffer ? Buffer.from(content) : Buffer.from(content); - var ecPK = ecurve.keyFromPublic(publicKey, 'hex').getPublic(); - var ephemeralSK = ecurve.genKeyPair(); - var ephemeralPK = ephemeralSK.getPublic(); - var sharedSecret = ephemeralSK.derive(ecPK); - var sharedSecretHex = getHexFromBN(sharedSecret); - var sharedKeys = sharedSecretToKeys(Buffer.from(sharedSecretHex, 'hex')); - var initializationVector = crypto.randomBytes(16); - var cipherText = aes256CbcEncrypt(initializationVector, sharedKeys.encryptionKey, plainText); - var macData = Buffer.concat([initializationVector, Buffer.from(ephemeralPK.encode('array', true)), cipherText]); - var mac = hmacSha256(sharedKeys.hmacKey, macData); - return { - iv: initializationVector.toString('hex'), - ephemeralPK: ephemeralPK.encode('hex', true), - cipherText: cipherText.toString('hex'), - mac: mac.toString('hex'), - wasString: isString - }; -} - -exports.encryptECIES = encryptECIES; -/** - * Decrypt content encrypted using ECIES - * @param {String} privateKey - secp256k1 private key hex string - * @param {Object} cipherObject - object to decrypt, should contain: - * iv (initialization vector), cipherText (cipher text), - * mac (message authentication code), ephemeralPublicKey - * wasString (boolean indicating with or not to return a buffer or string on decrypt) - * @return {Buffer} plaintext - * @throws {Error} if unable to decrypt - * @private - * @ignore - */ - -function decryptECIES(privateKey, cipherObject) { - var ecSK = ecurve.keyFromPrivate(privateKey, 'hex'); - var ephemeralPK = ecurve.keyFromPublic(cipherObject.ephemeralPK, 'hex').getPublic(); - var sharedSecret = ecSK.derive(ephemeralPK); - var sharedSecretBuffer = Buffer.from(getHexFromBN(sharedSecret), 'hex'); - var sharedKeys = sharedSecretToKeys(sharedSecretBuffer); - var ivBuffer = Buffer.from(cipherObject.iv, 'hex'); - var cipherTextBuffer = Buffer.from(cipherObject.cipherText, 'hex'); - var macData = Buffer.concat([ivBuffer, Buffer.from(ephemeralPK.encode('array', true)), cipherTextBuffer]); - var actualMac = hmacSha256(sharedKeys.hmacKey, macData); - var expectedMac = Buffer.from(cipherObject.mac, 'hex'); - - if (!equalConstTime(expectedMac, actualMac)) { - throw new Error('Decryption failed: failure in MAC check'); - } - - var plainText = aes256CbcDecrypt(ivBuffer, sharedKeys.encryptionKey, cipherTextBuffer); - - if (cipherObject.wasString) { - return plainText.toString(); - } else { - return plainText; - } -} - -exports.decryptECIES = decryptECIES; -/** - * Sign content using ECDSA - * - * @param {String} privateKey - secp256k1 private key hex string - * @param {Object} content - content to sign - * @return {Object} contains: - * signature - Hex encoded DER signature - * public key - Hex encoded private string taken from privateKey - * @private - * @ignore - */ - -function signECDSA(privateKey, content) { - var contentBuffer = content instanceof Buffer ? content : Buffer.from(content); - var ecPrivate = ecurve.keyFromPrivate(privateKey, 'hex'); - var publicKey = keys_1.getPublicKeyFromPrivate(privateKey); - var contentHash = crypto.createHash('sha256').update(contentBuffer).digest(); - var signature = ecPrivate.sign(contentHash); - var signatureString = signature.toDER('hex'); - return { - signature: signatureString, - publicKey: publicKey - }; -} - -exports.signECDSA = signECDSA; -/** -* @ignore -*/ - -function getBuffer(content) { - if (content instanceof Buffer) return content;else if (content instanceof ArrayBuffer) return Buffer.from(content);else return Buffer.from(content); -} -/** - * Verify content using ECDSA - * @param {String | Buffer} content - Content to verify was signed - * @param {String} publicKey - secp256k1 private key hex string - * @param {String} signature - Hex encoded DER signature - * @return {Boolean} returns true when signature matches publickey + content, false if not - * @private - * @ignore - */ - - -function verifyECDSA(content, publicKey, signature) { - var contentBuffer = getBuffer(content); - var ecPublic = ecurve.keyFromPublic(publicKey, 'hex'); - var contentHash = crypto.createHash('sha256').update(contentBuffer).digest(); - return ecPublic.verify(contentHash, signature); -} - -exports.verifyECDSA = verifyECDSA; -},{"elliptic":"xha3","crypto":"mRF4","../keys":"qabb","buffer":"dskh"}],"Ifs7":[function(require,module,exports) { -"use strict"; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var errors_1 = require("../errors"); - -var SESSION_VERSION = '1.0.0'; -/** - * @ignore - */ - -var SessionData = -/*#__PURE__*/ -function () { - function SessionData(options) { - _classCallCheck(this, SessionData); - - this.version = SESSION_VERSION; - this.appPrivateKey = options.appPrivateKey; - this.identityAddress = options.identityAddress; - this.username = options.username; - this.coreNode = options.coreNode; - this.hubUrl = options.hubUrl; - this.userData = options.userData; - this.transitKey = options.transitKey; - } - - _createClass(SessionData, [{ - key: "getGaiaHubConfig", - value: function getGaiaHubConfig() { - return this.userData && this.userData.gaiaHubConfig; - } - }, { - key: "setGaiaHubConfig", - value: function setGaiaHubConfig(config) { - this.userData.gaiaHubConfig = config; - } - }, { - key: "toString", - value: function toString() { - return JSON.stringify(this); - } - }], [{ - key: "fromJSON", - value: function fromJSON(json) { - if (json.version !== SESSION_VERSION) { - throw new errors_1.InvalidStateError("JSON data version ".concat(json.version, " not supported by SessionData")); - } - - var options = { - appPrivateKey: json.appPrivateKey, - identityAddress: json.identityAddress, - username: json.username, - coreNode: json.coreNode, - hubUrl: json.hubUrl, - userData: json.userData, - transitKey: json.transitKey - }; - return new SessionData(options); - } - }]); - - return SessionData; -}(); - -exports.SessionData = SessionData; -},{"../errors":"V7fS"}],"Tg89":[function(require,module,exports) { -"use strict"; - -function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } - -function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } - -function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } - -function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } - -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var sessionData_1 = require("./sessionData"); // import { BLOCKSTACK_GAIA_HUB_LABEL } from '../storage/hub' - - -var authConstants_1 = require("./authConstants"); - -var errors_1 = require("../errors"); // import { Logger } from '../logger' - -/** - * An abstract class representing the SessionDataStore interface. - - */ - - -var SessionDataStore = -/*#__PURE__*/ -function () { - function SessionDataStore(sessionOptions) { - _classCallCheck(this, SessionDataStore); - - if (sessionOptions) { - var newSessionData = new sessionData_1.SessionData(sessionOptions); - this.setSessionData(newSessionData); - } - } - - _createClass(SessionDataStore, [{ - key: "getSessionData", - value: function getSessionData() { - throw new Error('Abstract class'); - } - /* eslint-disable */ - - }, { - key: "setSessionData", - value: function setSessionData(session) { - throw new Error('Abstract class'); - } - }, { - key: "deleteSessionData", - value: function deleteSessionData() { - throw new Error('Abstract class'); - } - }]); - - return SessionDataStore; -}(); - -exports.SessionDataStore = SessionDataStore; -/** - * Stores session data in the instance of this class. - * @ignore - */ - -var InstanceDataStore = -/*#__PURE__*/ -function (_SessionDataStore) { - _inherits(InstanceDataStore, _SessionDataStore); - - function InstanceDataStore(sessionOptions) { - var _this; - - _classCallCheck(this, InstanceDataStore); - - _this = _possibleConstructorReturn(this, _getPrototypeOf(InstanceDataStore).call(this, sessionOptions)); - - if (!_this.sessionData) { - _this.setSessionData(new sessionData_1.SessionData({})); - } - - return _this; - } - - _createClass(InstanceDataStore, [{ - key: "getSessionData", - value: function getSessionData() { - if (!this.sessionData) { - throw new errors_1.NoSessionDataError('No session data was found.'); - } - - return this.sessionData; - } - }, { - key: "setSessionData", - value: function setSessionData(session) { - this.sessionData = session; - return true; - } - }, { - key: "deleteSessionData", - value: function deleteSessionData() { - this.setSessionData(new sessionData_1.SessionData({})); - return true; - } - }]); - - return InstanceDataStore; -}(SessionDataStore); - -exports.InstanceDataStore = InstanceDataStore; -/** - * Stores session data in browser a localStorage entry. - * @ignore - */ - -var LocalStorageStore = -/*#__PURE__*/ -function (_SessionDataStore2) { - _inherits(LocalStorageStore, _SessionDataStore2); - - function LocalStorageStore(sessionOptions) { - var _this2; - - _classCallCheck(this, LocalStorageStore); - - _this2 = _possibleConstructorReturn(this, _getPrototypeOf(LocalStorageStore).call(this, sessionOptions)); - - if (sessionOptions && sessionOptions.storeOptions && sessionOptions.storeOptions.localStorageKey && typeof sessionOptions.storeOptions.localStorageKey === 'string') { - _this2.key = sessionOptions.storeOptions.localStorageKey; - } else { - _this2.key = authConstants_1.LOCALSTORAGE_SESSION_KEY; - } - - var data = localStorage.getItem(_this2.key); - - if (!data) { - var sessionData = new sessionData_1.SessionData({}); - - _this2.setSessionData(sessionData); - } - - return _this2; - } - - _createClass(LocalStorageStore, [{ - key: "getSessionData", - value: function getSessionData() { - var data = localStorage.getItem(this.key); - - if (!data) { - throw new errors_1.NoSessionDataError('No session data was found in localStorage'); - } - - var dataJSON = JSON.parse(data); - return sessionData_1.SessionData.fromJSON(dataJSON); - } - }, { - key: "setSessionData", - value: function setSessionData(session) { - localStorage.setItem(this.key, session.toString()); - return true; - } - }, { - key: "deleteSessionData", - value: function deleteSessionData() { - localStorage.removeItem(this.key); - this.setSessionData(new sessionData_1.SessionData({})); - return true; - } - }]); - - return LocalStorageStore; -}(SessionDataStore); - -exports.LocalStorageStore = LocalStorageStore; -},{"./sessionData":"Ifs7","./authConstants":"UTxZ","../errors":"V7fS"}],"A2is":[function(require,module,exports) { -'use strict'; - -module.exports = str => encodeURIComponent(str).replace(/[!'()*]/g, x => "%".concat(x.charCodeAt(0).toString(16).toUpperCase())); -},{}],"pWxZ":[function(require,module,exports) { -'use strict'; - -var token = '%[a-f0-9]{2}'; -var singleMatcher = new RegExp(token, 'gi'); -var multiMatcher = new RegExp('(' + token + ')+', 'gi'); - -function decodeComponents(components, split) { - try { - // Try to decode the entire string first - return decodeURIComponent(components.join('')); - } catch (err) {// Do nothing - } - - if (components.length === 1) { - return components; - } - - split = split || 1; // Split the array in 2 parts - - var left = components.slice(0, split); - var right = components.slice(split); - return Array.prototype.concat.call([], decodeComponents(left), decodeComponents(right)); -} - -function decode(input) { - try { - return decodeURIComponent(input); - } catch (err) { - var tokens = input.match(singleMatcher); - - for (var i = 1; i < tokens.length; i++) { - input = decodeComponents(tokens, i).join(''); - tokens = input.match(singleMatcher); - } - - return input; - } -} - -function customDecodeURIComponent(input) { - // Keep track of all the replacements and prefill the map with the `BOM` - var replaceMap = { - '%FE%FF': '\uFFFD\uFFFD', - '%FF%FE': '\uFFFD\uFFFD' - }; - var match = multiMatcher.exec(input); - - while (match) { - try { - // Decode as big chunks as possible - replaceMap[match[0]] = decodeURIComponent(match[0]); - } catch (err) { - var result = decode(match[0]); - - if (result !== match[0]) { - replaceMap[match[0]] = result; - } - } - - match = multiMatcher.exec(input); - } // Add `%C2` at the end of the map to make sure it does not replace the combinator before everything else - - - replaceMap['%C2'] = '\uFFFD'; - var entries = Object.keys(replaceMap); - - for (var i = 0; i < entries.length; i++) { - // Replace all decoded components - var key = entries[i]; - input = input.replace(new RegExp(key, 'g'), replaceMap[key]); - } - - return input; -} - -module.exports = function (encodedURI) { - if (typeof encodedURI !== 'string') { - throw new TypeError('Expected `encodedURI` to be of type `string`, got `' + typeof encodedURI + '`'); - } - - try { - encodedURI = encodedURI.replace(/\+/g, ' '); // Try the built in decoder first - - return decodeURIComponent(encodedURI); - } catch (err) { - // Fallback to a more advanced decoder - return customDecodeURIComponent(encodedURI); - } -}; -},{}],"t7Jq":[function(require,module,exports) { -'use strict'; - -module.exports = function (string, separator) { - if (!(typeof string === 'string' && typeof separator === 'string')) { - throw new TypeError('Expected the arguments to be of type `string`'); - } - - if (separator === '') { - return [string]; - } - - var separatorIndex = string.indexOf(separator); - - if (separatorIndex === -1) { - return [string]; - } - - return [string.slice(0, separatorIndex), string.slice(separatorIndex + separator.length)]; -}; -},{}],"FvpG":[function(require,module,exports) { -'use strict'; - -function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function (obj) { return typeof obj; }; } else { _typeof = function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } - -function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } - -function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } - -function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } - -function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } - -var strictUriEncode = require('strict-uri-encode'); - -var decodeComponent = require('decode-uri-component'); - -var splitOnFirst = require('split-on-first'); - -function encoderForArrayFormat(options) { - switch (options.arrayFormat) { - case 'index': - return function (key) { - return function (result, value) { - var index = result.length; - - if (value === undefined || options.skipNull && value === null) { - return result; - } - - if (value === null) { - return [].concat(_toConsumableArray(result), [[encode(key, options), '[', index, ']'].join('')]); - } - - return [].concat(_toConsumableArray(result), [[encode(key, options), '[', encode(index, options), ']=', encode(value, options)].join('')]); - }; - }; - - case 'bracket': - return function (key) { - return function (result, value) { - if (value === undefined || options.skipNull && value === null) { - return result; - } - - if (value === null) { - return [].concat(_toConsumableArray(result), [[encode(key, options), '[]'].join('')]); - } - - return [].concat(_toConsumableArray(result), [[encode(key, options), '[]=', encode(value, options)].join('')]); - }; - }; - - case 'comma': - return function (key) { - return function (result, value) { - if (value === null || value === undefined || value.length === 0) { - return result; - } - - if (result.length === 0) { - return [[encode(key, options), '=', encode(value, options)].join('')]; - } - - return [[result, encode(value, options)].join(',')]; - }; - }; - - default: - return function (key) { - return function (result, value) { - if (value === undefined || options.skipNull && value === null) { - return result; - } - - if (value === null) { - return [].concat(_toConsumableArray(result), [encode(key, options)]); - } - - return [].concat(_toConsumableArray(result), [[encode(key, options), '=', encode(value, options)].join('')]); - }; - }; - } -} - -function parserForArrayFormat(options) { - var result; - - switch (options.arrayFormat) { - case 'index': - return function (key, value, accumulator) { - result = /\[(\d*)\]$/.exec(key); - key = key.replace(/\[\d*\]$/, ''); - - if (!result) { - accumulator[key] = value; - return; - } - - if (accumulator[key] === undefined) { - accumulator[key] = {}; - } - - accumulator[key][result[1]] = value; - }; - - case 'bracket': - return function (key, value, accumulator) { - result = /(\[\])$/.exec(key); - key = key.replace(/\[\]$/, ''); - - if (!result) { - accumulator[key] = value; - return; - } - - if (accumulator[key] === undefined) { - accumulator[key] = [value]; - return; - } - - accumulator[key] = [].concat(accumulator[key], value); - }; - - case 'comma': - return function (key, value, accumulator) { - var isArray = typeof value === 'string' && value.split('').indexOf(',') > -1; - var newValue = isArray ? value.split(',') : value; - accumulator[key] = newValue; - }; - - default: - return function (key, value, accumulator) { - if (accumulator[key] === undefined) { - accumulator[key] = value; - return; - } - - accumulator[key] = [].concat(accumulator[key], value); - }; - } -} - -function encode(value, options) { - if (options.encode) { - return options.strict ? strictUriEncode(value) : encodeURIComponent(value); - } - - return value; -} - -function decode(value, options) { - if (options.decode) { - return decodeComponent(value); - } - - return value; -} - -function keysSorter(input) { - if (Array.isArray(input)) { - return input.sort(); - } - - if (_typeof(input) === 'object') { - return keysSorter(Object.keys(input)).sort(function (a, b) { - return Number(a) - Number(b); - }).map(function (key) { - return input[key]; - }); - } - - return input; -} - -function removeHash(input) { - var hashStart = input.indexOf('#'); - - if (hashStart !== -1) { - input = input.slice(0, hashStart); - } - - return input; -} - -function getHash(url) { - var hash = ''; - var hashStart = url.indexOf('#'); - - if (hashStart !== -1) { - hash = url.slice(hashStart); - } - - return hash; -} - -function extract(input) { - input = removeHash(input); - var queryStart = input.indexOf('?'); - - if (queryStart === -1) { - return ''; - } - - return input.slice(queryStart + 1); -} - -function parseValue(value, options) { - if (options.parseNumbers && !Number.isNaN(Number(value)) && typeof value === 'string' && value.trim() !== '') { - value = Number(value); - } else if (options.parseBooleans && value !== null && (value.toLowerCase() === 'true' || value.toLowerCase() === 'false')) { - value = value.toLowerCase() === 'true'; - } - - return value; -} - -function parse(input, options) { - options = Object.assign({ - decode: true, - sort: true, - arrayFormat: 'none', - parseNumbers: false, - parseBooleans: false - }, options); - var formatter = parserForArrayFormat(options); // Create an object with no prototype - - var ret = Object.create(null); - - if (typeof input !== 'string') { - return ret; - } - - input = input.trim().replace(/^[?#&]/, ''); - - if (!input) { - return ret; - } - - for (var param of input.split('&')) { - var [key, value] = splitOnFirst(options.decode ? param.replace(/\+/g, ' ') : param, '='); // Missing `=` should be `null`: - // http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters - - value = value === undefined ? null : decode(value, options); - formatter(decode(key, options), value, ret); - } - - for (var _key of Object.keys(ret)) { - var _value = ret[_key]; - - if (_typeof(_value) === 'object' && _value !== null) { - for (var k of Object.keys(_value)) { - _value[k] = parseValue(_value[k], options); - } - } else { - ret[_key] = parseValue(_value, options); - } - } - - if (options.sort === false) { - return ret; - } - - return (options.sort === true ? Object.keys(ret).sort() : Object.keys(ret).sort(options.sort)).reduce(function (result, key) { - var value = ret[key]; - - if (Boolean(value) && _typeof(value) === 'object' && !Array.isArray(value)) { - // Sort object keys, not values - result[key] = keysSorter(value); - } else { - result[key] = value; - } - - return result; - }, Object.create(null)); -} - -exports.extract = extract; -exports.parse = parse; - -exports.stringify = function (object, options) { - if (!object) { - return ''; - } - - options = Object.assign({ - encode: true, - strict: true, - arrayFormat: 'none' - }, options); - var formatter = encoderForArrayFormat(options); - var objectCopy = Object.assign({}, object); - - if (options.skipNull) { - for (var key of Object.keys(objectCopy)) { - if (objectCopy[key] === undefined || objectCopy[key] === null) { - delete objectCopy[key]; - } - } - } - - var keys = Object.keys(objectCopy); - - if (options.sort !== false) { - keys.sort(options.sort); - } - - return keys.map(function (key) { - var value = object[key]; - - if (value === undefined) { - return ''; - } - - if (value === null) { - return encode(key, options); - } - - if (Array.isArray(value)) { - return value.reduce(formatter(key), []).join('&'); - } - - return encode(key, options) + '=' + encode(value, options); - }).filter(function (x) { - return x.length > 0; - }).join('&'); -}; - -exports.parseUrl = function (input, options) { - return { - url: removeHash(input).split('?')[0] || '', - query: parse(extract(input), options) - }; -}; - -exports.stringifyUrl = function (input, options) { - var url = removeHash(input.url).split('?')[0] || ''; - var queryFromUrl = exports.extract(input.url); - var parsedQueryFromUrl = exports.parse(queryFromUrl); - var hash = getHash(input.url); - var query = Object.assign(parsedQueryFromUrl, input.query); - var queryString = exports.stringify(query, options); - - if (queryString) { - queryString = "?".concat(queryString); - } - - return "".concat(url).concat(queryString).concat(hash); -}; -},{"strict-uri-encode":"A2is","decode-uri-component":"pWxZ","split-on-first":"t7Jq"}],"ZtGn":[function(require,module,exports) { -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var queryString = require("query-string"); // @ts-ignore: Could not find a declaration file for module - - -var jsontokens_1 = require("jsontokens"); - -var utils_1 = require("../utils"); - -var fetchUtil_1 = require("../fetchUtil"); - -var logger_1 = require("../logger"); -/** - * Retrieves the authentication request from the query string - * @return {String|null} the authentication request or `null` if - * the query string parameter `authRequest` is not found - * @private - * @ignore - */ - - -function getAuthRequestFromURL() { - var location = utils_1.getGlobalObject('location', { - throwIfUnavailable: true, - usageDesc: 'getAuthRequestFromURL' - }); - var queryDict = queryString.parse(location.search); - - if (queryDict.authRequest) { - return queryDict.authRequest.split("".concat(utils_1.BLOCKSTACK_HANDLER, ":")).join(''); - } else { - return null; - } -} - -exports.getAuthRequestFromURL = getAuthRequestFromURL; -/** - * Fetches the contents of the manifest file specified in the authentication request - * - * @param {String} authRequest encoded and signed authentication request - * @return {Promise} Returns a `Promise` that resolves to the JSON - * object manifest file unless there's an error in which case rejects with an error - * message. - * @private - * @ignore - */ - -function fetchAppManifest(authRequest) { - return new Promise(function (resolve, reject) { - if (!authRequest) { - reject('Invalid auth request'); - } else { - var payload = jsontokens_1.decodeToken(authRequest).payload; - - if (typeof payload === 'string') { - throw new Error('Unexpected token payload type of string'); - } - - var manifestURI = payload.manifest_uri; - - try { - logger_1.Logger.debug("Fetching manifest from ".concat(manifestURI)); - fetchUtil_1.fetchPrivate(manifestURI).then(function (response) { - return response.text(); - }).then(function (responseText) { - return JSON.parse(responseText); - }).then(function (responseJSON) { - resolve(Object.assign({}, responseJSON, { - manifestURI: manifestURI - })); - }).catch(function (e) { - logger_1.Logger.debug(e.stack); - reject('Could not fetch manifest.json'); - }); - } catch (e) { - logger_1.Logger.debug(e.stack); - reject('Could not fetch manifest.json'); - } - } - }); -} - -exports.fetchAppManifest = fetchAppManifest; -/** - * Redirect the user's browser to the app using the `redirect_uri` - * specified in the authentication request, passing the authentication - * response token as a query parameter. - * - * @param {String} authRequest encoded and signed authentication request token - * @param {String} authResponse encoded and signed authentication response token - * @return {void} - * @throws {Error} if there is no redirect uri - * @private - * @ignore - */ - -function redirectUserToApp(authRequest, authResponse) { - var payload = jsontokens_1.decodeToken(authRequest).payload; - - if (typeof payload === 'string') { - throw new Error('Unexpected token payload type of string'); - } - - var redirectURI = payload.redirect_uri; - logger_1.Logger.debug(redirectURI); - - if (redirectURI) { - redirectURI = utils_1.updateQueryStringParameter(redirectURI, 'authResponse', authResponse); - } else { - throw new Error('Invalid redirect URI'); - } - - var location = utils_1.getGlobalObject('location', { - throwIfUnavailable: true, - usageDesc: 'redirectUserToApp' - }); - location.href = redirectURI; -} - -exports.redirectUserToApp = redirectUserToApp; -},{"query-string":"FvpG","jsontokens":"ap7v","../utils":"dEjD","../fetchUtil":"bSeT","../logger":"qjRs"}],"wlOj":[function(require,module,exports) { -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); // @ts-ignore: Could not find a declaration file for module - -var jsontokens_1 = require("jsontokens"); - -var dids_1 = require("../dids"); - -var keys_1 = require("../keys"); - -var utils_1 = require("../utils"); - -var fetchUtil_1 = require("../fetchUtil"); - -var authProvider_1 = require("./authProvider"); -/** - * Checks if the ES256k signature on passed `token` match the claimed public key - * in the payload key `public_keys`. - * - * @param {String} token encoded and signed authentication token - * @return {Boolean} Returns `true` if the signature matches the claimed public key - * @throws {Error} if `token` contains multiple public keys - * @private - * @ignore - */ - - -function doSignaturesMatchPublicKeys(token) { - var payload = jsontokens_1.decodeToken(token).payload; - - if (typeof payload === 'string') { - throw new Error('Unexpected token payload type of string'); - } - - var publicKeys = payload.public_keys; - - if (publicKeys.length === 1) { - var publicKey = publicKeys[0]; - - try { - var tokenVerifier = new jsontokens_1.TokenVerifier('ES256k', publicKey); - var signatureVerified = tokenVerifier.verify(token); - - if (signatureVerified) { - return true; - } else { - return false; - } - } catch (e) { - return false; - } - } else { - throw new Error('Multiple public keys are not supported'); - } -} - -exports.doSignaturesMatchPublicKeys = doSignaturesMatchPublicKeys; -/** - * Makes sure that the identity address portion of - * the decentralized identifier passed in the issuer `iss` - * key of the token matches the public key - * - * @param {String} token encoded and signed authentication token - * @return {Boolean} if the identity address and public keys match - * @throws {Error} if ` token` has multiple public keys - * @private - * @ignore - */ - -function doPublicKeysMatchIssuer(token) { - var payload = jsontokens_1.decodeToken(token).payload; - - if (typeof payload === 'string') { - throw new Error('Unexpected token payload type of string'); - } - - var publicKeys = payload.public_keys; - var addressFromIssuer = dids_1.getAddressFromDID(payload.iss); - - if (publicKeys.length === 1) { - var addressFromPublicKeys = keys_1.publicKeyToAddress(publicKeys[0]); - - if (addressFromPublicKeys === addressFromIssuer) { - return true; - } - } else { - throw new Error('Multiple public keys are not supported'); - } - - return false; -} - -exports.doPublicKeysMatchIssuer = doPublicKeysMatchIssuer; -/** - * Looks up the identity address that owns the claimed username - * in `token` using the lookup endpoint provided in `nameLookupURL` - * to determine if the username is owned by the identity address - * that matches the claimed public key - * - * @param {String} token encoded and signed authentication token - * @param {String} nameLookupURL a URL to the name lookup endpoint of the Blockstack Core API - * @return {Promise} returns a `Promise` that resolves to - * `true` if the username is owned by the public key, otherwise the - * `Promise` resolves to `false` - * @private - * @ignore - */ - -function doPublicKeysMatchUsername(token, nameLookupURL) { - return Promise.resolve().then(function () { - var payload = jsontokens_1.decodeToken(token).payload; - - if (typeof payload === 'string') { - throw new Error('Unexpected token payload type of string'); - } - - if (!payload.username) { - return true; - } - - if (payload.username === null) { - return true; - } - - if (nameLookupURL === null) { - return false; - } - - var username = payload.username; - var url = "".concat(nameLookupURL.replace(/\/$/, ''), "/").concat(username); - return fetchUtil_1.fetchPrivate(url).then(function (response) { - return response.text(); - }).then(function (responseText) { - var responseJSON = JSON.parse(responseText); - - if (responseJSON.hasOwnProperty('address')) { - var nameOwningAddress = responseJSON.address; - var addressFromIssuer = dids_1.getAddressFromDID(payload.iss); - - if (nameOwningAddress === addressFromIssuer) { - return true; - } else { - return false; - } - } else { - return false; - } - }); - }).catch(function () { - return false; - }); -} - -exports.doPublicKeysMatchUsername = doPublicKeysMatchUsername; -/** - * Checks if the if the token issuance time and date is after the - * current time and date. - * - * @param {String} token encoded and signed authentication token - * @return {Boolean} `true` if the token was issued after the current time, - * otherwise returns `false` - * @private - * @ignore - */ - -function isIssuanceDateValid(token) { - var payload = jsontokens_1.decodeToken(token).payload; - - if (typeof payload === 'string') { - throw new Error('Unexpected token payload type of string'); - } - - if (payload.iat) { - if (typeof payload.iat !== 'number') { - return false; - } - - var issuedAt = new Date(payload.iat * 1000); // JWT times are in seconds - - if (new Date().getTime() < issuedAt.getTime()) { - return false; - } else { - return true; - } - } else { - return true; - } -} - -exports.isIssuanceDateValid = isIssuanceDateValid; -/** - * Checks if the expiration date of the `token` is before the current time - * @param {String} token encoded and signed authentication token - * @return {Boolean} `true` if the `token` has not yet expired, `false` - * if the `token` has expired - * - * @private - * @ignore - */ - -function isExpirationDateValid(token) { - var payload = jsontokens_1.decodeToken(token).payload; - - if (typeof payload === 'string') { - throw new Error('Unexpected token payload type of string'); - } - - if (payload.exp) { - if (typeof payload.exp !== 'number') { - return false; - } - - var expiresAt = new Date(payload.exp * 1000); // JWT times are in seconds - - if (new Date().getTime() > expiresAt.getTime()) { - return false; - } else { - return true; - } - } else { - return true; - } -} - -exports.isExpirationDateValid = isExpirationDateValid; -/** - * Makes sure the `manifest_uri` is a same origin absolute URL. - * @param {String} token encoded and signed authentication token - * @return {Boolean} `true` if valid, otherwise `false` - * @private - * @ignore - */ - -function isManifestUriValid(token) { - var payload = jsontokens_1.decodeToken(token).payload; - - if (typeof payload === 'string') { - throw new Error('Unexpected token payload type of string'); - } - - return utils_1.isSameOriginAbsoluteUrl(payload.domain_name, payload.manifest_uri); -} - -exports.isManifestUriValid = isManifestUriValid; -/** - * Makes sure the `redirect_uri` is a same origin absolute URL. - * @param {String} token encoded and signed authentication token - * @return {Boolean} `true` if valid, otherwise `false` - * @private - * @ignore - */ - -function isRedirectUriValid(token) { - var payload = jsontokens_1.decodeToken(token).payload; - - if (typeof payload === 'string') { - throw new Error('Unexpected token payload type of string'); - } - - return utils_1.isSameOriginAbsoluteUrl(payload.domain_name, payload.redirect_uri); -} - -exports.isRedirectUriValid = isRedirectUriValid; -/** - * Verify authentication request is valid. This function performs a number - * of checks on the authentication request token: - * * Checks that `token` has a valid issuance date & is not expired - * * Checks that `token` has a valid signature that matches the public key it claims - * * Checks that both the manifest and redirect URLs are absolute and conform to - * the same origin policy - * - * @param {String} token encoded and signed authentication request token - * @return {Promise} that resolves to true if the auth request - * is valid and false if it does not. It rejects with a String if the - * token is not signed - * @private - * @ignore - */ - -function verifyAuthRequest(token) { - return Promise.resolve().then(function () { - if (jsontokens_1.decodeToken(token).header.alg === 'none') { - throw new Error('Token must be signed in order to be verified'); - } - }).then(function () { - return Promise.all([isExpirationDateValid(token), isIssuanceDateValid(token), doSignaturesMatchPublicKeys(token), doPublicKeysMatchIssuer(token), isManifestUriValid(token), isRedirectUriValid(token)]); - }).then(function (values) { - if (values.every(Boolean)) { - return true; - } else { - return false; - } - }); -} - -exports.verifyAuthRequest = verifyAuthRequest; -/** - * Verify the authentication request is valid and - * fetch the app manifest file if valid. Otherwise, reject the promise. - * @param {String} token encoded and signed authentication request token - * @return {Promise} that resolves to the app manifest file in JSON format - * or rejects if the auth request or app manifest file is invalid - * @private - * @ignore - */ - -function verifyAuthRequestAndLoadManifest(token) { - return Promise.resolve().then(function () { - return verifyAuthRequest(token).then(function (valid) { - if (valid) { - return authProvider_1.fetchAppManifest(token); - } else { - return Promise.reject(); - } - }); - }); -} - -exports.verifyAuthRequestAndLoadManifest = verifyAuthRequestAndLoadManifest; -/** - * Verify the authentication response is valid - * @param {String} token the authentication response token - * @param {String} nameLookupURL the url use to verify owner of a username - * @return {Promise} that resolves to true if auth response - * is valid and false if it does not - * @private - * @ignore - */ - -function verifyAuthResponse(token, nameLookupURL) { - return Promise.all([isExpirationDateValid(token), isIssuanceDateValid(token), doSignaturesMatchPublicKeys(token), doPublicKeysMatchIssuer(token), doPublicKeysMatchUsername(token, nameLookupURL)]).then(function (values) { - if (values.every(Boolean)) { - return true; - } else { - return false; - } - }); -} - -exports.verifyAuthResponse = verifyAuthResponse; -},{"jsontokens":"ap7v","../dids":"oZHr","../keys":"qabb","../utils":"dEjD","../fetchUtil":"bSeT","./authProvider":"ZtGn"}],"bYSw":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var bitcoinjs_lib_1 = require("bitcoinjs-lib"); // @ts-ignore: Could not find a declaration file for module - - -var jsontokens_1 = require("jsontokens"); - -var utils_1 = require("../utils"); -/** - * Signs a profile token - * @param {Object} profile - the JSON of the profile to be signed - * @param {String} privateKey - the signing private key - * @param {Object} subject - the entity that the information is about - * @param {Object} issuer - the entity that is issuing the token - * @param {String} signingAlgorithm - the signing algorithm to use - * @param {Date} issuedAt - the time of issuance of the token - * @param {Date} expiresAt - the time of expiration of the token - * @returns {Object} - the signed profile token - * - */ - - -function signProfileToken(profile, privateKey, subject, issuer) { - var signingAlgorithm = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 'ES256K'; - var issuedAt = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : new Date(); - var expiresAt = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : utils_1.nextYear(); - - if (signingAlgorithm !== 'ES256K') { - throw new Error('Signing algorithm not supported'); - } - - var publicKey = jsontokens_1.SECP256K1Client.derivePublicKey(privateKey); - - if (!subject) { - subject = { - publicKey: publicKey - }; - } - - if (!issuer) { - issuer = { - publicKey: publicKey - }; - } - - var tokenSigner = new jsontokens_1.TokenSigner(signingAlgorithm, privateKey); - var payload = { - jti: utils_1.makeUUID4(), - iat: issuedAt.toISOString(), - exp: expiresAt.toISOString(), - subject: subject, - issuer: issuer, - claim: profile - }; - return tokenSigner.sign(payload); -} - -exports.signProfileToken = signProfileToken; -/** - * Wraps a token for a profile token file - * @param {String} token - the token to be wrapped - * @returns {Object} - including `token` and `decodedToken` - */ - -function wrapProfileToken(token) { - return { - token: token, - decodedToken: jsontokens_1.decodeToken(token) - }; -} - -exports.wrapProfileToken = wrapProfileToken; -/** - * Verifies a profile token - * @param {String} token - the token to be verified - * @param {String} publicKeyOrAddress - the public key or address of the - * keypair that is thought to have signed the token - * @returns {Object} - the verified, decoded profile token - * @throws {Error} - throws an error if token verification fails - */ - -function verifyProfileToken(token, publicKeyOrAddress) { - var decodedToken = jsontokens_1.decodeToken(token); - var payload = decodedToken.payload; - - if (typeof payload === 'string') { - throw new Error('Unexpected token payload type of string'); - } // Inspect and verify the subject - - - if (payload.hasOwnProperty('subject')) { - if (!payload.subject.hasOwnProperty('publicKey')) { - throw new Error('Token doesn\'t have a subject public key'); - } - } else { - throw new Error('Token doesn\'t have a subject'); - } // Inspect and verify the issuer - - - if (payload.hasOwnProperty('issuer')) { - if (!payload.issuer.hasOwnProperty('publicKey')) { - throw new Error('Token doesn\'t have an issuer public key'); - } - } else { - throw new Error('Token doesn\'t have an issuer'); - } // Inspect and verify the claim - - - if (!payload.hasOwnProperty('claim')) { - throw new Error('Token doesn\'t have a claim'); - } - - var issuerPublicKey = payload.issuer.publicKey; - var publicKeyBuffer = Buffer.from(issuerPublicKey, 'hex'); - var compressedKeyPair = bitcoinjs_lib_1.ECPair.fromPublicKey(publicKeyBuffer, { - compressed: true - }); - var compressedAddress = utils_1.ecPairToAddress(compressedKeyPair); - var uncompressedKeyPair = bitcoinjs_lib_1.ECPair.fromPublicKey(publicKeyBuffer, { - compressed: false - }); - var uncompressedAddress = utils_1.ecPairToAddress(uncompressedKeyPair); - - if (publicKeyOrAddress === issuerPublicKey) {// pass - } else if (publicKeyOrAddress === compressedAddress) {// pass - } else if (publicKeyOrAddress === uncompressedAddress) {// pass - } else { - throw new Error('Token issuer public key does not match the verifying value'); - } - - var tokenVerifier = new jsontokens_1.TokenVerifier(decodedToken.header.alg, issuerPublicKey); - - if (!tokenVerifier) { - throw new Error('Invalid token verifier'); - } - - var tokenVerified = tokenVerifier.verify(token); - - if (!tokenVerified) { - throw new Error('Token verification failed'); - } - - return decodedToken; -} - -exports.verifyProfileToken = verifyProfileToken; -/** - * Extracts a profile from an encoded token and optionally verifies it, - * if `publicKeyOrAddress` is provided. - * @param {String} token - the token to be extracted - * @param {String} publicKeyOrAddress - the public key or address of the - * keypair that is thought to have signed the token - * @returns {Object} - the profile extracted from the encoded token - * @throws {Error} - if the token isn't signed by the provided `publicKeyOrAddress` - */ - -function extractProfile(token) { - var publicKeyOrAddress = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; - var decodedToken; - - if (publicKeyOrAddress) { - decodedToken = verifyProfileToken(token, publicKeyOrAddress); - } else { - decodedToken = jsontokens_1.decodeToken(token); - } - - var profile = {}; - - if (decodedToken.hasOwnProperty('payload')) { - var payload = decodedToken.payload; - - if (typeof payload === 'string') { - throw new Error('Unexpected token payload type of string'); - } - - if (payload.hasOwnProperty('claim')) { - profile = payload.claim; - } - } - - return profile; -} - -exports.extractProfile = extractProfile; -},{"bitcoinjs-lib":"bZOe","jsontokens":"ap7v","../utils":"dEjD","buffer":"dskh"}],"OJUd":[function(require,module,exports) { -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var utils_1 = require("../utils"); - -var logger_1 = require("../logger"); -/** - * Detects if the native auth-browser is installed and is successfully - * launched via a custom protocol URI. - * @param {String} authRequest - * The encoded authRequest to be used as a query param in the custom URI. - * @param {String} successCallback - * The callback that is invoked when the protocol handler was detected. - * @param {String} failCallback - * The callback that is invoked when the protocol handler was not detected. - * @return {void} - */ - - -function launchCustomProtocol(authRequest, successCallback, failCallback) { - // Create a unique ID used for this protocol detection attempt. - var echoReplyID = Math.random().toString(36).substr(2, 9); - var echoReplyKeyPrefix = 'echo-reply-'; - var echoReplyKey = "".concat(echoReplyKeyPrefix).concat(echoReplyID); - - var _utils_1$getGlobalObj = utils_1.getGlobalObjects(['localStorage', 'document', 'setTimeout', 'clearTimeout', 'addEventListener', 'removeEventListener'], { - throwIfUnavailable: true, - usageDesc: 'detectProtocolLaunch' - }), - localStorage = _utils_1$getGlobalObj.localStorage, - document = _utils_1$getGlobalObj.document, - setTimeout = _utils_1$getGlobalObj.setTimeout, - clearTimeout = _utils_1$getGlobalObj.clearTimeout, - addEventListener = _utils_1$getGlobalObj.addEventListener, - removeEventListener = _utils_1$getGlobalObj.removeEventListener; // Use localStorage as a reliable cross-window communication method. - // Create the storage entry to signal a protocol detection attempt for the - // next browser window to check. - - - localStorage.setItem(echoReplyKey, Date.now().toString()); - - var cleanUpLocalStorage = function cleanUpLocalStorage() { - try { - localStorage.removeItem(echoReplyKey); // Also clear out any stale echo-reply keys older than 1 hour. - - for (var i = 0; i < localStorage.length; i++) { - var storageKey = localStorage.key(i); - - if (storageKey && storageKey.startsWith(echoReplyKeyPrefix)) { - var storageValue = localStorage.getItem(storageKey); - - if (storageValue === 'success' || Date.now() - parseInt(storageValue, 10) > 3600000) { - localStorage.removeItem(storageKey); - } - } - } - } catch (err) { - logger_1.Logger.error('Exception cleaning up echo-reply entries in localStorage'); - logger_1.Logger.error(err); - } - }; - - var detectionTimeout = 1000; - var redirectToWebAuthTimer = 0; - - var cancelWebAuthRedirectTimer = function cancelWebAuthRedirectTimer() { - if (redirectToWebAuthTimer) { - clearTimeout(redirectToWebAuthTimer); - redirectToWebAuthTimer = 0; - } - }; - - var startWebAuthRedirectTimer = function startWebAuthRedirectTimer() { - var timeout = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : detectionTimeout; - cancelWebAuthRedirectTimer(); - redirectToWebAuthTimer = setTimeout(function () { - if (redirectToWebAuthTimer) { - cancelWebAuthRedirectTimer(); - var nextFunc; - - if (localStorage.getItem(echoReplyKey) === 'success') { - logger_1.Logger.info('Protocol echo reply detected.'); - nextFunc = successCallback; - } else { - logger_1.Logger.info('Protocol handler not detected.'); - nextFunc = failCallback; - } - - failCallback = function failCallback() {}; - - successCallback = function successCallback() {}; - - cleanUpLocalStorage(); // Briefly wait since localStorage changes can - // sometimes be ignored when immediately redirected. - - setTimeout(function () { - return nextFunc(); - }, 100); - } - }, timeout); - }; - - startWebAuthRedirectTimer(); - var inputPromptTracker = document.createElement('input'); - inputPromptTracker.type = 'text'; // Setting display:none on an element prevents them from being focused/blurred. - // So we hide using 0 width/height/opacity, and set position:fixed so that the - // page does not scroll when the element is focused. - - var hiddenCssStyle = 'all: initial; position: fixed; top: 0; height: 0; width: 0; opacity: 0;'; - inputPromptTracker.style.cssText = hiddenCssStyle; // If the the focus of a page element is immediately changed then this likely indicates - // the protocol handler is installed, and the browser is prompting the user if they want - // to open the application. - - var inputBlurredFunc = function inputBlurredFunc() { - // Use a timeout of 100ms to ignore instant toggles between blur and focus. - // Browsers often perform an instant blur & focus when the protocol handler is working - // but not showing any browser prompts, so we want to ignore those instances. - var isRefocused = false; - inputPromptTracker.addEventListener('focus', function () { - isRefocused = true; - }, { - once: true, - capture: true - }); - setTimeout(function () { - if (redirectToWebAuthTimer && !isRefocused) { - logger_1.Logger.info('Detected possible browser prompt for opening the protocol handler app.'); - clearTimeout(redirectToWebAuthTimer); - inputPromptTracker.addEventListener('focus', function () { - if (redirectToWebAuthTimer) { - logger_1.Logger.info('Possible browser prompt closed, restarting auth redirect timeout.'); - startWebAuthRedirectTimer(); - } - }, { - once: true, - capture: true - }); - } - }, 100); - }; - - inputPromptTracker.addEventListener('blur', inputBlurredFunc, { - once: true, - capture: true - }); - setTimeout(function () { - return inputPromptTracker.removeEventListener('blur', inputBlurredFunc); - }, 200); - document.body.appendChild(inputPromptTracker); - inputPromptTracker.focus(); // Detect if document.visibility is immediately changed which is a strong - // indication that the protocol handler is working. We don't know for sure and - // can't predict future browser changes, so only increase the redirect timeout. - // This reduces the probability of a false-negative (where local auth works, but - // the original page was redirect to web auth because something took too long), - - var pageVisibilityChanged = function pageVisibilityChanged() { - if (document.hidden && redirectToWebAuthTimer) { - logger_1.Logger.info('Detected immediate page visibility change (protocol handler probably working).'); - startWebAuthRedirectTimer(3000); - } - }; - - document.addEventListener('visibilitychange', pageVisibilityChanged, { - once: true, - capture: true - }); - setTimeout(function () { - return document.removeEventListener('visibilitychange', pageVisibilityChanged); - }, 500); // Listen for the custom protocol echo reply via localStorage update event. - - addEventListener('storage', function replyEventListener(event) { - if (event.key === echoReplyKey && localStorage.getItem(echoReplyKey) === 'success') { - // Custom protocol worked, cancel the web auth redirect timer. - cancelWebAuthRedirectTimer(); - inputPromptTracker.removeEventListener('blur', inputBlurredFunc); - logger_1.Logger.info('Protocol echo reply detected from localStorage event.'); // Clean up event listener and localStorage. - - removeEventListener('storage', replyEventListener); - var nextFunc = successCallback; - - successCallback = function successCallback() {}; - - failCallback = function failCallback() {}; - - cleanUpLocalStorage(); // Briefly wait since localStorage changes can sometimes - // be ignored when immediately redirected. - - setTimeout(function () { - return nextFunc(); - }, 100); - } - }, false); // Use iframe technique for launching the protocol URI rather than setting `window.location`. - // This method prevents browsers like Safari, Opera, Firefox from showing error prompts - // about unknown protocol handler when app is not installed, and avoids an empty - // browser tab when the app is installed. - - logger_1.Logger.info('Attempting protocol launch via iframe injection.'); - var locationSrc = "".concat(utils_1.BLOCKSTACK_HANDLER, ":").concat(authRequest, "&echo=").concat(echoReplyID); - var iframe = document.createElement('iframe'); - var iframeStyle = 'all: initial; display: none; position: fixed; top: 0; height: 0; width: 0; opacity: 0;'; - iframe.style.cssText = iframeStyle; - iframe.src = locationSrc; - document.body.appendChild(iframe); -} - -exports.launchCustomProtocol = launchCustomProtocol; -},{"../utils":"dEjD","../logger":"qjRs"}],"kACS":[function(require,module,exports) { -"use strict"; - -var __awaiter = this && this.__awaiter || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - - function step(result) { - result.done ? resolve(result.value) : new P(function (resolve) { - resolve(result.value); - }).then(fulfilled, rejected); - } - - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var queryString = require("query-string"); // @ts-ignore: Could not find a declaration file for module - - -var jsontokens_1 = require("jsontokens"); - -var authVerification_1 = require("./authVerification"); - -var utils_1 = require("../utils"); - -var fetchUtil_1 = require("../fetchUtil"); - -var dids_1 = require("../dids"); - -var errors_1 = require("../errors"); - -var authMessages_1 = require("./authMessages"); - -var authConstants_1 = require("./authConstants"); - -var profileTokens_1 = require("../profiles/profileTokens"); - -var userSession_1 = require("./userSession"); - -var config_1 = require("../config"); - -var logger_1 = require("../logger"); - -var protocolEchoDetection_1 = require("./protocolEchoDetection"); - -var protocolLaunch_1 = require("./protocolLaunch"); - -var DEFAULT_PROFILE = { - '@type': 'Person', - '@context': 'http://schema.org' -}; -/** - * @deprecated - * #### v19 Use [[UserSession.isUserSignedIn]] instead. - * - * Check if a user is currently signed in. - * @return {Boolean} `true` if the user is signed in, `false` if not. - */ - -function isUserSignedIn() { - console.warn('DEPRECATION WARNING: The static isUserSignedIn() function will be deprecated in ' + 'the next major release of blockstack.js. Create an instance of UserSession and call the ' + 'instance method isUserSignedIn().'); - var userSession = new userSession_1.UserSession(); - return userSession.isUserSignedIn(); -} - -exports.isUserSignedIn = isUserSignedIn; -/** - * - * - * @deprecated - * #### v19 Use [[UserSession.isUserSignedIn]] instead. - * - * Generates an authentication request and redirects the user to the Blockstack - * browser to approve the sign in request. - * - * Please note that this requires that the web browser properly handles the - * `blockstack:` URL protocol handler. - * - * Most applications should use this - * method for sign in unless they require more fine grained control over how the - * authentication request is generated. If your app falls into this category, - * use `makeAuthRequest` and `redirectToSignInWithAuthRequest` to build your own sign in process. - * - * @param {String} [redirectURI=`${window.location.origin}/`] - * The location to which the identity provider will redirect the user after - * the user approves sign in. - * @param {String} [manifestURI=`${window.location.origin}/manifest.json`] - * Location of the manifest file. - * @param {Array} [scopes=DEFAULT_SCOPE] Defaults to requesting write access to - * this app's data store. - * An array of strings indicating which permissions this app is requesting. - * @return {void} - */ - -function redirectToSignIn(redirectURI, manifestURI, scopes) { - console.warn('DEPRECATION WARNING: The static redirectToSignIn() function will be deprecated in the ' + 'next major release of blockstack.js. Create an instance of UserSession and call the ' + 'instance method redirectToSignIn().'); - var authRequest = authMessages_1.makeAuthRequest(null, redirectURI, manifestURI, scopes); - redirectToSignInWithAuthRequest(authRequest); -} - -exports.redirectToSignIn = redirectToSignIn; -/** - * @deprecated - * #### v19 Use [[UserSession.isSignInPending]] instead. - * - * Check if there is a authentication request that hasn't been handled. - * - * Also checks for a protocol echo reply (which if detected then the page - * will be automatically redirected after this call). - * - * @return {Boolean} `true` if there is a pending sign in, otherwise `false` - */ - -function isSignInPending() { - try { - var isProtocolEcho = protocolEchoDetection_1.protocolEchoReplyDetection(); - - if (isProtocolEcho) { - logger_1.Logger.info('protocolEchoReply detected from isSignInPending call, the page is about to redirect.'); - return true; - } - } catch (error) { - logger_1.Logger.error("Error checking for protocol echo reply isSignInPending: ".concat(error)); - } - - return !!getAuthResponseToken(); -} - -exports.isSignInPending = isSignInPending; -/** - * @deprecated - * #### v19 Use [[UserSession.getAuthResponseToken]] instead. - * - * Retrieve the authentication token from the URL query - * @return {String} the authentication token if it exists otherwise `null` - */ - -function getAuthResponseToken() { - var search = utils_1.getGlobalObject('location', { - throwIfUnavailable: true, - usageDesc: 'getAuthResponseToken' - }).search; - var queryDict = queryString.parse(search); - return queryDict.authResponse ? queryDict.authResponse : ''; -} - -exports.getAuthResponseToken = getAuthResponseToken; -/** - * @deprecated - * #### v19 Use [[UserSession.loadUserData]] instead. - * - * Retrieves the user data object. The user's profile is stored in the key `profile`. - * @return {Object} User data object. -*/ - -function loadUserData() { - console.warn('DEPRECATION WARNING: The static loadUserData() function will be deprecated in the ' + 'next major release of blockstack.js. Create an instance of UserSession and call the ' + 'instance method loadUserData().'); - var userSession = new userSession_1.UserSession(); - return userSession.loadUserData(); -} - -exports.loadUserData = loadUserData; -/** - * @deprecated - * #### v19 Use [[UserSession.signUserOut]] instead. - * - * Sign the user out and optionally redirect to given location. - * @param redirectURL - * Location to redirect user to after sign out. - * Only used in environments with `window` available - */ - -function signUserOut(redirectURL, caller) { - var userSession = caller || new userSession_1.UserSession(); - userSession.store.deleteSessionData(); - - if (redirectURL) { - utils_1.getGlobalObject('location', { - throwIfUnavailable: true, - usageDesc: 'signUserOut' - }).href = redirectURL; - } -} - -exports.signUserOut = signUserOut; -/** - * @deprecated - * #### v19 Use [[UserSession.redirectToSignInWithAuthRequest]] instead. - * - * Redirects the user to the Blockstack browser to approve the sign in request - * given. - * - * The user is redirected to the `blockstackIDHost` if the `blockstack:` - * protocol handler is not detected. Please note that the protocol handler detection - * does not work on all browsers. - * @param {String} authRequest - the authentication request generated by `makeAuthRequest` - * @param {String} blockstackIDHost - the URL to redirect the user to if the blockstack - * protocol handler is not detected - * @return {void} - */ - -function redirectToSignInWithAuthRequest(authRequest) { - var blockstackIDHost = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : authConstants_1.DEFAULT_BLOCKSTACK_HOST; - authRequest = authRequest || authMessages_1.makeAuthRequest(); - var httpsURI = "".concat(blockstackIDHost, "?authRequest=").concat(authRequest); - - var _utils_1$getGlobalObj = utils_1.getGlobalObjects(['navigator', 'location'], { - throwIfUnavailable: true, - usageDesc: 'redirectToSignInWithAuthRequest' - }), - navigator = _utils_1$getGlobalObj.navigator, - location = _utils_1$getGlobalObj.location; // If they're on a mobile OS, always redirect them to HTTPS site - - - if (/Android|webOS|iPhone|iPad|iPod|Opera Mini/i.test(navigator.userAgent)) { - logger_1.Logger.info('detected mobile OS, sending to https'); - location.href = httpsURI; - return; - } - - function successCallback() { - logger_1.Logger.info('protocol handler detected'); // The detection function should open the link for us - } - - function failCallback() { - logger_1.Logger.warn('protocol handler not detected'); - location.href = httpsURI; - } - - protocolLaunch_1.launchCustomProtocol(authRequest, successCallback, failCallback); -} - -exports.redirectToSignInWithAuthRequest = redirectToSignInWithAuthRequest; -/** - * @deprecated - * #### v19 Use [[UserSession.handlePendingSignIn]] instead. - * - * Try to process any pending sign in request by returning a `Promise` that resolves - * to the user data object if the sign in succeeds. - * - * @param {String} nameLookupURL - the endpoint against which to verify public - * keys match claimed username - * @param {String} authResponseToken - the signed authentication response token - * @param {String} transitKey - the transit private key that corresponds to the transit public key - * that was provided in the authentication request - * @return {Promise} that resolves to the user data object if successful and rejects - * if handling the sign in request fails or there was no pending sign in request. - */ - -function handlePendingSignIn() { - var nameLookupURL = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; - var authResponseToken = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getAuthResponseToken(); - var transitKey = arguments.length > 2 ? arguments[2] : undefined; - var caller = arguments.length > 3 ? arguments[3] : undefined; - return __awaiter(this, void 0, void 0, - /*#__PURE__*/ - regeneratorRuntime.mark(function _callee() { - var isProtocolEcho, msg, sessionData, _tokenPayload, isValid, tokenPayload, appPrivateKey, coreSessionToken, hubUrl, gaiaAssociationToken, userData, profileURL, response, responseText, wrappedProfile, profile; - - return regeneratorRuntime.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - _context.prev = 0; - isProtocolEcho = protocolEchoDetection_1.protocolEchoReplyDetection(); - - if (!isProtocolEcho) { - _context.next = 6; - break; - } - - msg = 'handlePendingSignIn called while protocolEchoReply was detected, and ' + 'the page is about to redirect. This function will resolve with an error after ' + 'several seconds, if the page was not redirected for some reason.'; - logger_1.Logger.info(msg); - return _context.abrupt("return", new Promise(function (_resolve, reject) { - setTimeout(function () { - logger_1.Logger.error('Page should have redirected by now. handlePendingSignIn will now throw.'); - reject(msg); - }, 3000); - })); - - case 6: - _context.next = 11; - break; - - case 8: - _context.prev = 8; - _context.t0 = _context["catch"](0); - logger_1.Logger.error("Error checking for protocol echo reply handlePendingSignIn: ".concat(_context.t0)); - - case 11: - if (!caller) { - caller = new userSession_1.UserSession(); - } - - sessionData = caller.store.getSessionData(); - - if (!sessionData.userData) { - _context.next = 15; - break; - } - - throw new errors_1.LoginFailedError('Existing user session found.'); - - case 15: - if (!transitKey) { - transitKey = caller.store.getSessionData().transitKey; - } - - if (nameLookupURL) { - _context.next = 22; - break; - } - - _tokenPayload = jsontokens_1.decodeToken(authResponseToken).payload; - - if (!(typeof _tokenPayload === 'string')) { - _context.next = 20; - break; - } - - throw new Error('Unexpected token payload type of string'); - - case 20: - if (utils_1.isLaterVersion(_tokenPayload.version, '1.3.0') && _tokenPayload.blockstackAPIUrl !== null && _tokenPayload.blockstackAPIUrl !== undefined) { - // override globally - logger_1.Logger.info("Overriding ".concat(config_1.config.network.blockstackAPIUrl, " ") + "with ".concat(_tokenPayload.blockstackAPIUrl)); - config_1.config.network.blockstackAPIUrl = _tokenPayload.blockstackAPIUrl; - } - - nameLookupURL = "".concat(config_1.config.network.blockstackAPIUrl).concat(authConstants_1.NAME_LOOKUP_PATH); - - case 22: - _context.next = 24; - return authVerification_1.verifyAuthResponse(authResponseToken, nameLookupURL); - - case 24: - isValid = _context.sent; - - if (isValid) { - _context.next = 27; - break; - } - - throw new errors_1.LoginFailedError('Invalid authentication response.'); - - case 27: - tokenPayload = jsontokens_1.decodeToken(authResponseToken).payload; - - if (!(typeof tokenPayload === 'string')) { - _context.next = 30; - break; - } - - throw new Error('Unexpected token payload type of string'); - - case 30: - // TODO: real version handling - appPrivateKey = tokenPayload.private_key; - coreSessionToken = tokenPayload.core_token; - - if (!utils_1.isLaterVersion(tokenPayload.version, '1.1.0')) { - _context.next = 53; - break; - } - - if (!(transitKey !== undefined && transitKey != null)) { - _context.next = 52; - break; - } - - if (!(tokenPayload.private_key !== undefined && tokenPayload.private_key !== null)) { - _context.next = 49; - break; - } - - _context.prev = 35; - appPrivateKey = authMessages_1.decryptPrivateKey(transitKey, tokenPayload.private_key); - _context.next = 49; - break; - - case 39: - _context.prev = 39; - _context.t1 = _context["catch"](35); - logger_1.Logger.warn('Failed decryption of appPrivateKey, will try to use as given'); - _context.prev = 42; - utils_1.hexStringToECPair(tokenPayload.private_key); - _context.next = 49; - break; - - case 46: - _context.prev = 46; - _context.t2 = _context["catch"](42); - throw new errors_1.LoginFailedError('Failed decrypting appPrivateKey. Usually means' + ' that the transit key has changed during login.'); - - case 49: - if (coreSessionToken !== undefined && coreSessionToken !== null) { - try { - coreSessionToken = authMessages_1.decryptPrivateKey(transitKey, coreSessionToken); - } catch (e) { - logger_1.Logger.info('Failed decryption of coreSessionToken, will try to use as given'); - } - } - - _context.next = 53; - break; - - case 52: - throw new errors_1.LoginFailedError('Authenticating with protocol > 1.1.0 requires transit' + ' key, and none found.'); - - case 53: - hubUrl = authConstants_1.BLOCKSTACK_DEFAULT_GAIA_HUB_URL; - - if (utils_1.isLaterVersion(tokenPayload.version, '1.2.0') && tokenPayload.hubUrl !== null && tokenPayload.hubUrl !== undefined) { - hubUrl = tokenPayload.hubUrl; - } - - if (utils_1.isLaterVersion(tokenPayload.version, '1.3.0') && tokenPayload.associationToken !== null && tokenPayload.associationToken !== undefined) { - gaiaAssociationToken = tokenPayload.associationToken; - } - - userData = { - username: tokenPayload.username, - profile: tokenPayload.profile, - email: tokenPayload.email, - decentralizedID: tokenPayload.iss, - identityAddress: dids_1.getAddressFromDID(tokenPayload.iss), - appPrivateKey: appPrivateKey, - coreSessionToken: coreSessionToken, - authResponseToken: authResponseToken, - hubUrl: hubUrl, - gaiaAssociationToken: gaiaAssociationToken - }; - profileURL = tokenPayload.profile_url; - - if (!(!userData.profile && profileURL)) { - _context.next = 74; - break; - } - - _context.next = 61; - return fetchUtil_1.fetchPrivate(profileURL); - - case 61: - response = _context.sent; - - if (response.ok) { - _context.next = 66; - break; - } - - // return blank profile if we fail to fetch - userData.profile = Object.assign({}, DEFAULT_PROFILE); - _context.next = 72; - break; - - case 66: - _context.next = 68; - return response.text(); - - case 68: - responseText = _context.sent; - wrappedProfile = JSON.parse(responseText); - profile = profileTokens_1.extractProfile(wrappedProfile[0].token); - userData.profile = profile; - - case 72: - _context.next = 75; - break; - - case 74: - userData.profile = tokenPayload.profile; - - case 75: - sessionData.userData = userData; - caller.store.setSessionData(sessionData); - return _context.abrupt("return", userData); - - case 78: - case "end": - return _context.stop(); - } - } - }, _callee, null, [[0, 8], [35, 39], [42, 46]]); - })); -} - -exports.handlePendingSignIn = handlePendingSignIn; -},{"query-string":"FvpG","jsontokens":"ap7v","./authVerification":"wlOj","../utils":"dEjD","../fetchUtil":"bSeT","../dids":"oZHr","../errors":"V7fS","./authMessages":"u2eb","./authConstants":"UTxZ","../profiles/profileTokens":"bYSw","./userSession":"rsLE","../config":"GmrD","../logger":"qjRs","./protocolEchoDetection":"ou4A","./protocolLaunch":"OJUd"}],"hGa9":[function(require,module,exports) { -var Buffer = require("buffer").Buffer; -"use strict"; - -var __awaiter = this && this.__awaiter || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - - function step(result) { - result.done ? resolve(result.value) : new P(function (resolve) { - resolve(result.value); - }).then(fulfilled, rejected); - } - - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var bitcoinjs_lib_1 = require("bitcoinjs-lib"); - -var crypto = require("crypto"); // @ts-ignore: Could not find a declaration file for module - - -var jsontokens_1 = require("jsontokens"); - -var utils_1 = require("../utils"); - -var fetchUtil_1 = require("../fetchUtil"); - -var keys_1 = require("../keys"); - -var logger_1 = require("../logger"); - -var errors_1 = require("../errors"); -/** - * @ignore - */ - - -exports.BLOCKSTACK_GAIA_HUB_LABEL = 'blockstack-gaia-hub-config'; -/** - * - * @param filename - * @param contents - * @param hubConfig - * @param contentType - * - * @ignore - */ - -function uploadToGaiaHub(filename, contents, hubConfig) { - var contentType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'application/octet-stream'; - return __awaiter(this, void 0, void 0, - /*#__PURE__*/ - regeneratorRuntime.mark(function _callee() { - var response, responseText, responseJSON; - return regeneratorRuntime.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - logger_1.Logger.debug("uploadToGaiaHub: uploading ".concat(filename, " to ").concat(hubConfig.server)); - _context.next = 3; - return fetchUtil_1.fetchPrivate("".concat(hubConfig.server, "/store/").concat(hubConfig.address, "/").concat(filename), { - method: 'POST', - headers: { - 'Content-Type': contentType, - Authorization: "bearer ".concat(hubConfig.token) - }, - body: contents - }); - - case 3: - response = _context.sent; - - if (response.ok) { - _context.next = 6; - break; - } - - throw new Error('Error when uploading to Gaia hub'); - - case 6: - _context.next = 8; - return response.text(); - - case 8: - responseText = _context.sent; - responseJSON = JSON.parse(responseText); - return _context.abrupt("return", responseJSON.publicURL); - - case 11: - case "end": - return _context.stop(); - } - } - }, _callee); - })); -} - -exports.uploadToGaiaHub = uploadToGaiaHub; - -function deleteFromGaiaHub(filename, hubConfig) { - return __awaiter(this, void 0, void 0, - /*#__PURE__*/ - regeneratorRuntime.mark(function _callee2() { - var response, responseMsg, errorMsg; - return regeneratorRuntime.wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - logger_1.Logger.debug("deleteFromGaiaHub: deleting ".concat(filename, " from ").concat(hubConfig.server)); - _context2.next = 3; - return fetch("".concat(hubConfig.server, "/delete/").concat(hubConfig.address, "/").concat(filename), { - method: 'DELETE', - headers: { - Authorization: "bearer ".concat(hubConfig.token) - } - }); - - case 3: - response = _context2.sent; - - if (response.ok) { - _context2.next = 22; - break; - } - - responseMsg = ''; - _context2.prev = 6; - _context2.next = 9; - return response.text(); - - case 9: - responseMsg = _context2.sent; - _context2.next = 15; - break; - - case 12: - _context2.prev = 12; - _context2.t0 = _context2["catch"](6); - logger_1.Logger.debug("Error getting bad http response text: ".concat(_context2.t0)); - - case 15: - errorMsg = 'Error deleting file from Gaia hub: ' + "".concat(response.status, " ").concat(response.statusText, ": ").concat(responseMsg); - logger_1.Logger.error(errorMsg); - - if (!(response.status === 404)) { - _context2.next = 21; - break; - } - - throw new errors_1.FileNotFound(errorMsg); - - case 21: - throw new Error(errorMsg); - - case 22: - case "end": - return _context2.stop(); - } - } - }, _callee2, null, [[6, 12]]); - })); -} - -exports.deleteFromGaiaHub = deleteFromGaiaHub; -/** - * - * @param filename - * @param hubConfig - * - * @ignore - */ - -function getFullReadUrl(filename, hubConfig) { - return Promise.resolve("".concat(hubConfig.url_prefix).concat(hubConfig.address, "/").concat(filename)); -} - -exports.getFullReadUrl = getFullReadUrl; -/** - * - * @param challengeText - * @param signerKeyHex - * - * @ignore - */ - -function makeLegacyAuthToken(challengeText, signerKeyHex) { - // only sign specific legacy auth challenges. - var parsedChallenge; - - try { - parsedChallenge = JSON.parse(challengeText); - } catch (err) { - throw new Error('Failed in parsing legacy challenge text from the gaia hub.'); - } - - if (parsedChallenge[0] === 'gaiahub' && parsedChallenge[3] === 'blockstack_storage_please_sign') { - var signer = utils_1.hexStringToECPair(signerKeyHex + (signerKeyHex.length === 64 ? '01' : '')); - var digest = bitcoinjs_lib_1.crypto.sha256(Buffer.from(challengeText)); - var signatureBuffer = signer.sign(digest); - var signatureWithHash = bitcoinjs_lib_1.script.signature.encode(signatureBuffer, bitcoinjs_lib_1.Transaction.SIGHASH_NONE); // We only want the DER encoding so remove the sighash version byte at the end. - // See: https://github.com/bitcoinjs/bitcoinjs-lib/issues/1241#issuecomment-428062912 - - var signature = signatureWithHash.toString('hex').slice(0, -2); - var publickey = keys_1.getPublicKeyFromPrivate(signerKeyHex); - var token = Buffer.from(JSON.stringify({ - publickey: publickey, - signature: signature - })).toString('base64'); - return token; - } else { - throw new Error('Failed to connect to legacy gaia hub. If you operate this hub, please update.'); - } -} -/** - * - * @param hubInfo - * @param signerKeyHex - * @param hubUrl - * @param associationToken - * - * @ignore - */ - - -function makeV1GaiaAuthToken(hubInfo, signerKeyHex, hubUrl, associationToken) { - var challengeText = hubInfo.challenge_text; - var handlesV1Auth = hubInfo.latest_auth_version && parseInt(hubInfo.latest_auth_version.slice(1), 10) >= 1; - var iss = keys_1.getPublicKeyFromPrivate(signerKeyHex); - - if (!handlesV1Auth) { - return makeLegacyAuthToken(challengeText, signerKeyHex); - } - - var salt = crypto.randomBytes(16).toString('hex'); - var payload = { - gaiaChallenge: challengeText, - hubUrl: hubUrl, - iss: iss, - salt: salt, - associationToken: associationToken - }; - var token = new jsontokens_1.TokenSigner('ES256K', signerKeyHex).sign(payload); - return "v1:".concat(token); -} -/** - * - * @ignore - */ - - -function connectToGaiaHub(gaiaHubUrl, challengeSignerHex, associationToken) { - return __awaiter(this, void 0, void 0, - /*#__PURE__*/ - regeneratorRuntime.mark(function _callee3() { - var response, hubInfo, readURL, token, address; - return regeneratorRuntime.wrap(function _callee3$(_context3) { - while (1) { - switch (_context3.prev = _context3.next) { - case 0: - logger_1.Logger.debug("connectToGaiaHub: ".concat(gaiaHubUrl, "/hub_info")); - _context3.next = 3; - return fetchUtil_1.fetchPrivate("".concat(gaiaHubUrl, "/hub_info")); - - case 3: - response = _context3.sent; - _context3.next = 6; - return response.json(); - - case 6: - hubInfo = _context3.sent; - readURL = hubInfo.read_url_prefix; - token = makeV1GaiaAuthToken(hubInfo, challengeSignerHex, gaiaHubUrl, associationToken); - address = utils_1.ecPairToAddress(utils_1.hexStringToECPair(challengeSignerHex + (challengeSignerHex.length === 64 ? '01' : ''))); - return _context3.abrupt("return", { - url_prefix: readURL, - address: address, - token: token, - server: gaiaHubUrl - }); - - case 11: - case "end": - return _context3.stop(); - } - } - }, _callee3); - })); -} - -exports.connectToGaiaHub = connectToGaiaHub; -/** - * - * @param gaiaHubUrl - * @param appPrivateKey - * - * @ignore - */ - -function getBucketUrl(gaiaHubUrl, appPrivateKey) { - return __awaiter(this, void 0, void 0, - /*#__PURE__*/ - regeneratorRuntime.mark(function _callee4() { - var challengeSigner, response, responseText, responseJSON, readURL, address, bucketUrl; - return regeneratorRuntime.wrap(function _callee4$(_context4) { - while (1) { - switch (_context4.prev = _context4.next) { - case 0: - challengeSigner = bitcoinjs_lib_1.ECPair.fromPrivateKey(Buffer.from(appPrivateKey, 'hex')); - _context4.next = 3; - return fetchUtil_1.fetchPrivate("".concat(gaiaHubUrl, "/hub_info")); - - case 3: - response = _context4.sent; - _context4.next = 6; - return response.text(); - - case 6: - responseText = _context4.sent; - responseJSON = JSON.parse(responseText); - readURL = responseJSON.read_url_prefix; - address = utils_1.ecPairToAddress(challengeSigner); - bucketUrl = "".concat(readURL).concat(address, "/"); - return _context4.abrupt("return", bucketUrl); - - case 12: - case "end": - return _context4.stop(); - } - } - }, _callee4); - })); -} - -exports.getBucketUrl = getBucketUrl; -},{"bitcoinjs-lib":"bZOe","crypto":"mRF4","jsontokens":"ap7v","../utils":"dEjD","../fetchUtil":"bSeT","../keys":"qabb","../logger":"qjRs","../errors":"V7fS","buffer":"dskh"}],"iZFk":[function(require,module,exports) { -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.getZoneFileTemplate = getZoneFileTemplate; - -function getZoneFileTemplate() { - return '{$origin}\n\ -{$ttl}\n\ -\n\ -; SOA Record\n\ -{name} {ttl} IN SOA {mname}{rname}(\n\ -{serial} ;serial\n\ -{refresh} ;refresh\n\ -{retry} ;retry\n\ -{expire} ;expire\n\ -{minimum} ;minimum ttl\n\ -)\n\ -\n\ -; NS Records\n\ -{ns}\n\ -\n\ -; MX Records\n\ -{mx}\n\ -\n\ -; A Records\n\ -{a}\n\ -\n\ -; AAAA Records\n\ -{aaaa}\n\ -\n\ -; CNAME Records\n\ -{cname}\n\ -\n\ -; PTR Records\n\ -{ptr}\n\ -\n\ -; TXT Records\n\ -{txt}\n\ -\n\ -; SRV Records\n\ -{srv}\n\ -\n\ -; SPF Records\n\ -{spf}\n\ -\n\ -; URI Records\n\ -{uri}\n\ -'; -} -},{}],"NxOW":[function(require,module,exports) { -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.makeZoneFile = makeZoneFile; - -var _zoneFileTemplate = require("./zoneFileTemplate"); - -function makeZoneFile(jsonZoneFile, template = (0, _zoneFileTemplate.getZoneFileTemplate)()) { - template = processOrigin(jsonZoneFile['$origin'], template); - template = processTTL(jsonZoneFile['$ttl'], template); - template = processSOA(jsonZoneFile['soa'], template); - template = processNS(jsonZoneFile['ns'], template); - template = processA(jsonZoneFile['a'], template); - template = processAAAA(jsonZoneFile['aaaa'], template); - template = processCNAME(jsonZoneFile['cname'], template); - template = processMX(jsonZoneFile['mx'], template); - template = processPTR(jsonZoneFile['ptr'], template); - template = processTXT(jsonZoneFile['txt'], template); - template = processSRV(jsonZoneFile['srv'], template); - template = processSPF(jsonZoneFile['spf'], template); - template = processURI(jsonZoneFile['uri'], template); - template = processValues(jsonZoneFile, template); - return template.replace(/\n{2,}/gim, '\n\n'); -} - -; - -function processOrigin(data, template) { - let ret = ''; - - if (typeof data !== 'undefined') { - ret += '$ORIGIN ' + data; - } - - return template.replace('{$origin}', ret); -} - -; - -function processTTL(data, template) { - let ret = ''; - - if (typeof data !== 'undefined') { - ret += '$TTL ' + data; - } - - return template.replace('{$ttl}', ret); -} - -; - -function processSOA(data, template) { - let ret = template; - - if (typeof data !== 'undefined') { - data.name = data.name || '@'; - data.ttl = data.ttl || ''; - - for (const key in data) { - const value = data[key]; - ret = ret.replace('{' + key + '}', value + '\t'); - } - } - - return ret; -} - -; - -function processNS(data, template) { - let ret = ''; - - if (data) { - for (const record of data) { - ret += (record.name || '@') + '\t'; - if (record.ttl) ret += record.ttl + '\t'; - ret += 'IN\tNS\t' + record.host + '\n'; - } - } - - return template.replace('{ns}', ret); -} - -; - -function processA(data, template) { - let ret = ''; - - if (data) { - for (const record of data) { - ret += (record.name || '@') + '\t'; - if (record.ttl) ret += record.ttl + '\t'; - ret += 'IN\tA\t' + record.ip + '\n'; - } - } - - return template.replace('{a}', ret); -} - -; - -function processAAAA(data, template) { - let ret = ''; - - if (data) { - for (const record of data) { - ret += (record.name || '@') + '\t'; - if (record.ttl) ret += record.ttl + '\t'; - ret += 'IN\tAAAA\t' + record.ip + '\n'; - } - } - - return template.replace('{aaaa}', ret); -} - -; - -function processCNAME(data, template) { - let ret = ''; - - if (data) { - for (const record of data) { - ret += (record.name || '@') + '\t'; - if (record.ttl) ret += record.ttl + '\t'; - ret += 'IN\tCNAME\t' + record.alias + '\n'; - } - } - - return template.replace('{cname}', ret); -} - -; - -function processMX(data, template) { - let ret = ''; - - if (data) { - for (const record of data) { - ret += (record.name || '@') + '\t'; - if (record.ttl) ret += record.ttl + '\t'; - ret += 'IN\tMX\t' + record.preference + '\t' + record.host + '\n'; - } - } - - return template.replace('{mx}', ret); -} - -; - -function processPTR(data, template) { - let ret = ''; - - if (data) { - for (const record of data) { - ret += (record.name || '@') + '\t'; - if (record.ttl) ret += record.ttl + '\t'; - ret += 'IN\tPTR\t' + record.host + '\n'; - } - } - - return template.replace('{ptr}', ret); -} - -; - -function processTXT(data, template) { - let ret = ''; - - if (data) { - for (const record of data) { - ret += (record.name || '@') + '\t'; - if (record.ttl) ret += record.ttl + '\t'; - ret += 'IN\tTXT\t'; - const txtData = record.txt; - - if (typeof txtData === 'string') { - ret += '"' + txtData + '"'; - } else if (txtData instanceof Array) { - ret += txtData.map(function (datum) { - return '"' + datum + '"'; - }).join(' '); - } - - ret += '\n'; - } - } - - return template.replace('{txt}', ret); -} - -; - -function processSRV(data, template) { - let ret = ''; - - if (data) { - for (const record of data) { - ret += (record.name || '@') + '\t'; - if (record.ttl) ret += record.ttl + '\t'; - ret += 'IN\tSRV\t' + record.priority + '\t'; - ret += record.weight + '\t'; - ret += record.port + '\t'; - ret += record.target + '\n'; - } - } - - return template.replace('{srv}', ret); -} - -; - -function processSPF(data, template) { - let ret = ''; - - if (data) { - for (const record of data) { - ret += (record.name || '@') + '\t'; - if (record.ttl) ret += record.ttl + '\t'; - ret += 'IN\tSPF\t' + record.data + '\n'; - } - } - - return template.replace('{spf}', ret); -} - -; - -function processURI(data, template) { - let ret = ''; - - if (data) { - for (const record of data) { - ret += (record.name || '@') + '\t'; - if (record.ttl) ret += record.ttl + '\t'; - ret += 'IN\tURI\t' + record.priority + '\t'; - ret += record.weight + '\t'; - ret += '"' + record.target + '"\n'; - } - } - - return template.replace('{uri}', ret); -} - -; - -function processValues(jsonZoneFile, template) { - template = template.replace('{zone}', jsonZoneFile['$origin'] || (jsonZoneFile['soa'] ? jsonZoneFile['soa']['name'] : false) || ''); - template = template.replace('{datetime}', new Date().toISOString()); - const time = Math.round(Date.now() / 1000); - return template.replace('{time}', `${time}`); -} - -; -},{"./zoneFileTemplate":"iZFk"}],"hORT":[function(require,module,exports) { -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.parseZoneFile = parseZoneFile; - -function parseZoneFile(text) { - text = removeComments(text); - text = flatten(text); - return parseRRs(text); -} - -; - -function removeComments(text) { - const re = /(^|[^\\]);.*/g; - return text.replace(re, function (m, g1) { - return g1 ? g1 : ''; // if g1 is set/matched, re-insert it, else remove - }); -} - -function flatten(text) { - const captured = []; - const re = /\([\s\S]*?\)/gim; - let match = re.exec(text); - - while (match !== null) { - const replacement = match[0].replace(/\s+/gm, ' '); - captured.push({ - match, - replacement - }); // captured Text, index, input - - match = re.exec(text); - } - - const arrText = text.split(''); - - for (const cur of captured) { - const { - match, - replacement - } = cur; - arrText.splice(match.index, match[0].length, replacement); - } - - return arrText.join('').replace(/\(|\)/gim, ' '); -} - -function parseRRs(text) { - const ret = {}; - const rrs = text.split('\n'); - - for (const rr of rrs) { - if (!rr || !rr.trim()) { - continue; - } - - const uRR = rr.toUpperCase(); - - if (/\s+TXT\s+/.test(uRR)) { - ret.txt = ret.txt || []; - ret.txt.push(parseTXT(rr)); - } else if (uRR.indexOf('$ORIGIN') === 0) { - ret.$origin = rr.split(/\s+/g)[1]; - } else if (uRR.indexOf('$TTL') === 0) { - ret.$ttl = parseInt(rr.split(/\s+/g)[1], 10); - } else if (/\s+SOA\s+/.test(uRR)) { - ret.soa = parseSOA(rr); - } else if (/\s+NS\s+/.test(uRR)) { - ret.ns = ret.ns || []; - ret.ns.push(parseNS(rr)); - } else if (/\s+A\s+/.test(uRR)) { - ret.a = ret.a || []; - ret.a.push(parseA(rr, ret.a)); - } else if (/\s+AAAA\s+/.test(uRR)) { - ret.aaaa = ret.aaaa || []; - ret.aaaa.push(parseAAAA(rr)); - } else if (/\s+CNAME\s+/.test(uRR)) { - ret.cname = ret.cname || []; - ret.cname.push(parseCNAME(rr)); - } else if (/\s+MX\s+/.test(uRR)) { - ret.mx = ret.mx || []; - ret.mx.push(parseMX(rr)); - } else if (/\s+PTR\s+/.test(uRR)) { - ret.ptr = ret.ptr || []; - ret.ptr.push(parsePTR(rr, ret.ptr, ret.$origin)); - } else if (/\s+SRV\s+/.test(uRR)) { - ret.srv = ret.srv || []; - ret.srv.push(parseSRV(rr)); - } else if (/\s+SPF\s+/.test(uRR)) { - ret.spf = ret.spf || []; - ret.spf.push(parseSPF(rr)); - } else if (/\s+URI\s+/.test(uRR)) { - ret.uri = ret.uri || []; - ret.uri.push(parseURI(rr)); - } - } - - return ret; -} - -function parseSOA(rr) { - const soa = {}; - const rrTokens = rr.trim().split(/\s+/g); - const l = rrTokens.length; - soa.name = rrTokens[0]; - soa.minimum = parseInt(rrTokens[l - 1], 10); - soa.expire = parseInt(rrTokens[l - 2], 10); - soa.retry = parseInt(rrTokens[l - 3], 10); - soa.refresh = parseInt(rrTokens[l - 4], 10); - soa.serial = parseInt(rrTokens[l - 5], 10); - soa.rname = rrTokens[l - 6]; - soa.mname = rrTokens[l - 7]; - if (!isNaN(rrTokens[1])) soa.ttl = parseInt(rrTokens[1], 10); - return soa; -} - -function parseNS(rr) { - const rrTokens = rr.trim().split(/\s+/g); - const l = rrTokens.length; - const result = { - name: rrTokens[0], - host: rrTokens[l - 1] - }; - if (!isNaN(rrTokens[1])) result.ttl = parseInt(rrTokens[1], 10); - return result; -} - -function parseA(rr, recordsSoFar) { - const rrTokens = rr.trim().split(/\s+/g); - const urrTokens = rr.trim().toUpperCase().split(/\s+/g); - const l = rrTokens.length; - const result = { - name: rrTokens[0], - ip: rrTokens[l - 1] - }; - - if (urrTokens.lastIndexOf('A') === 0) { - if (recordsSoFar.length) { - result.name = recordsSoFar[recordsSoFar.length - 1].name; - } else { - result.name = '@'; - } - } - - if (!isNaN(rrTokens[1])) result.ttl = parseInt(rrTokens[1], 10); - return result; -} - -function parseAAAA(rr) { - const rrTokens = rr.trim().split(/\s+/g); - const l = rrTokens.length; - const result = { - name: rrTokens[0], - ip: rrTokens[l - 1] - }; - if (!isNaN(rrTokens[1])) result.ttl = parseInt(rrTokens[1], 10); - return result; -} - -function parseCNAME(rr) { - const rrTokens = rr.trim().split(/\s+/g); - const l = rrTokens.length; - const result = { - name: rrTokens[0], - alias: rrTokens[l - 1] - }; - if (!isNaN(rrTokens[1])) result.ttl = parseInt(rrTokens[1], 10); - return result; -} - -function parseMX(rr) { - const rrTokens = rr.trim().split(/\s+/g); - const l = rrTokens.length; - const result = { - name: rrTokens[0], - preference: parseInt(rrTokens[l - 2], 10), - host: rrTokens[l - 1] - }; - if (!isNaN(rrTokens[1])) result.ttl = parseInt(rrTokens[1], 10); - return result; -} - -function parseTXT(rr) { - const rrTokens = rr.trim().match(/[^\s\"']+|\"[^\"]*\"|'[^']*'/g); - if (!rrTokens) throw new Error('Failure to tokenize TXT record'); - const l = rrTokens.length; - const indexTXT = rrTokens.indexOf('TXT'); - - function stripText(txt) { - if (txt.indexOf('\"') > -1) { - txt = txt.split('\"')[1]; - } - - if (txt.indexOf('"') > -1) { - txt = txt.split('"')[1]; - } - - return txt; - } - - let tokenTxt; - - if (l - indexTXT - 1 > 1) { - tokenTxt = rrTokens.slice(indexTXT + 1).map(stripText); - } else { - tokenTxt = stripText(rrTokens[l - 1]); - } - - const result = { - name: rrTokens[0], - txt: tokenTxt - }; - if (!isNaN(rrTokens[1])) result.ttl = parseInt(rrTokens[1], 10); - return result; -} - -function parsePTR(rr, recordsSoFar, currentOrigin) { - const rrTokens = rr.trim().split(/\s+/g); - const urrTokens = rr.trim().toUpperCase().split(/\s+/g); - - if (urrTokens.lastIndexOf('PTR') === 0 && recordsSoFar[recordsSoFar.length - 1]) { - rrTokens.unshift(recordsSoFar[recordsSoFar.length - 1].name); - } - - const l = rrTokens.length; - const result = { - name: rrTokens[0], - fullname: rrTokens[0] + '.' + currentOrigin, - host: rrTokens[l - 1] - }; - if (!isNaN(rrTokens[1])) result.ttl = parseInt(rrTokens[1], 10); - return result; -} - -function parseSRV(rr) { - const rrTokens = rr.trim().split(/\s+/g); - const l = rrTokens.length; - const result = { - name: rrTokens[0], - target: rrTokens[l - 1], - priority: parseInt(rrTokens[l - 4], 10), - weight: parseInt(rrTokens[l - 3], 10), - port: parseInt(rrTokens[l - 2], 10) - }; - if (!isNaN(rrTokens[1])) result.ttl = parseInt(rrTokens[1], 10); - return result; -} - -function parseSPF(rr) { - const rrTokens = rr.trim().split(/\s+/g); - const result = { - name: rrTokens[0], - data: '' - }; - let l = rrTokens.length; - - while (l-- > 4) { - result.data = rrTokens[l] + ' ' + result.data.trim(); - } - - if (!isNaN(rrTokens[1])) result.ttl = parseInt(rrTokens[1], 10); - return result; -} - -function parseURI(rr) { - const rrTokens = rr.trim().split(/\s+/g); - const l = rrTokens.length; - const result = { - name: rrTokens[0], - target: rrTokens[l - 1].replace(/"/g, ''), - priority: parseInt(rrTokens[l - 3], 10), - weight: parseInt(rrTokens[l - 2], 10) - }; - if (!isNaN(rrTokens[1])) result.ttl = parseInt(rrTokens[1], 10); - return result; -} -},{}],"pQTi":[function(require,module,exports) { -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.ZoneFile = void 0; - -var _makeZoneFile = require("./makeZoneFile"); - -var _parseZoneFile = require("./parseZoneFile"); - -class ZoneFile { - constructor(zoneFile) { - if (typeof zoneFile === 'object') { - this.jsonZoneFile = JSON.parse(JSON.stringify(zoneFile)); - } else if (typeof zoneFile === 'string') { - this.jsonZoneFile = (0, _parseZoneFile.parseZoneFile)(zoneFile); - } - } - - toJSON() { - return this.jsonZoneFile; - } - - toString() { - return (0, _makeZoneFile.makeZoneFile)(this.toJSON()); - } - -} - -exports.ZoneFile = ZoneFile; -},{"./makeZoneFile":"NxOW","./parseZoneFile":"hORT"}],"jTHD":[function(require,module,exports) { -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -Object.defineProperty(exports, "makeZoneFile", { - enumerable: true, - get: function () { - return _makeZoneFile.makeZoneFile; - } -}); -Object.defineProperty(exports, "parseZoneFile", { - enumerable: true, - get: function () { - return _parseZoneFile.parseZoneFile; - } -}); -Object.defineProperty(exports, "ZoneFile", { - enumerable: true, - get: function () { - return _zoneFile.ZoneFile; - } -}); - -var _makeZoneFile = require("./makeZoneFile"); - -var _parseZoneFile = require("./parseZoneFile"); - -var _zoneFile = require("./zoneFile"); -},{"./makeZoneFile":"NxOW","./parseZoneFile":"hORT","./zoneFile":"pQTi"}],"AwTs":[function(require,module,exports) { -var process = require("process"); -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.apply = apply; -exports.wrapSync = exports.asyncify = asyncify; -exports.auto = auto; -exports.autoInject = autoInject; -exports.cargo = cargo; -exports.cargoQueue = cargo$1; -exports.compose = compose; -exports.constant = constant; -exports.doUntil = doUntil; -exports.ensureAsync = ensureAsync; -exports.groupBy = groupBy; -exports.groupBySeries = groupBySeries; -exports.mapValues = mapValues; -exports.mapValuesSeries = mapValuesSeries; -exports.memoize = memoize; -exports.parallel = parallel; -exports.parallelLimit = parallelLimit; -exports.priorityQueue = priorityQueue; -exports.queue = queue$1; -exports.foldr = exports.reduceRight = reduceRight; -exports.reflect = reflect; -exports.reflectAll = reflectAll; -exports.retry = retry; -exports.retryable = retryable; -exports.seq = seq; -exports.series = series; -exports.timeout = timeout; -exports.times = times; -exports.timesLimit = timesLimit; -exports.timesSeries = timesSeries; -exports.transform = transform; -exports.unmemoize = unmemoize; -exports.until = until; -exports.during = exports.whilst = exports.waterfall = exports.tryEach = exports.sortBy = exports.anySeries = exports.someSeries = exports.anyLimit = exports.someLimit = exports.any = exports.some = exports.setImmediate = exports.rejectSeries = exports.rejectLimit = exports.reject = exports.foldl = exports.inject = exports.reduce = exports.race = exports.nextTick = exports.mapValuesLimit = exports.mapSeries = exports.mapLimit = exports.map = exports.log = exports.groupByLimit = exports.forever = exports.selectSeries = exports.filterSeries = exports.selectLimit = exports.filterLimit = exports.select = exports.filter = exports.allSeries = exports.everySeries = exports.allLimit = exports.everyLimit = exports.all = exports.every = exports.forEachSeries = exports.eachSeries = exports.forEachOfSeries = exports.eachOfSeries = exports.forEachOfLimit = exports.eachOfLimit = exports.forEachOf = exports.eachOf = exports.forEachLimit = exports.eachLimit = exports.forEach = exports.each = exports.doDuring = exports.doWhilst = exports.dir = exports.findSeries = exports.detectSeries = exports.findLimit = exports.detectLimit = exports.find = exports.detect = exports.flatMapSeries = exports.concatSeries = exports.flatMapLimit = exports.concatLimit = exports.flatMap = exports.concat = exports.applyEachSeries = exports.applyEach = exports.default = void 0; - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } - -function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } - -function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } - -function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } - -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } - -function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } - -function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } - -function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } - -function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } - -/** - * Creates a continuation function with some arguments already applied. - * - * Useful as a shorthand when combined with other control flow functions. Any - * arguments passed to the returned function are added to the arguments - * originally passed to apply. - * - * @name apply - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {Function} fn - The function you want to eventually apply all - * arguments to. Invokes with (arguments...). - * @param {...*} arguments... - Any number of arguments to automatically apply - * when the continuation is called. - * @returns {Function} the partially-applied function - * @example - * - * // using apply - * async.parallel([ - * async.apply(fs.writeFile, 'testfile1', 'test1'), - * async.apply(fs.writeFile, 'testfile2', 'test2') - * ]); - * - * - * // the same process without using apply - * async.parallel([ - * function(callback) { - * fs.writeFile('testfile1', 'test1', callback); - * }, - * function(callback) { - * fs.writeFile('testfile2', 'test2', callback); - * } - * ]); - * - * // It's possible to pass any number of additional arguments when calling the - * // continuation: - * - * node> var fn = async.apply(sys.puts, 'one'); - * node> fn('two', 'three'); - * one - * two - * three - */ -function apply(fn) { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - - return function () { - for (var _len2 = arguments.length, callArgs = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - callArgs[_key2] = arguments[_key2]; - } - - return fn.apply(void 0, args.concat(callArgs)); - }; -} - -function initialParams(fn) { - return function () - /*, callback*/ - { - for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { - args[_key3] = arguments[_key3]; - } - - var callback = args.pop(); - return fn.call(this, args, callback); - }; -} -/* istanbul ignore file */ - - -var hasSetImmediate = typeof setImmediate === 'function' && setImmediate; -var hasNextTick = (typeof process === "undefined" ? "undefined" : _typeof(process)) === 'object' && typeof process.nextTick === 'function'; - -function fallback(fn) { - setTimeout(fn, 0); -} - -function wrap(defer) { - return function (fn) { - for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) { - args[_key4 - 1] = arguments[_key4]; - } - - return defer(function () { - return fn.apply(void 0, args); - }); - }; -} - -var _defer; - -if (hasSetImmediate) { - _defer = setImmediate; -} else if (hasNextTick) { - _defer = process.nextTick; -} else { - _defer = fallback; -} - -var setImmediate$1 = wrap(_defer); -/** - * Take a sync function and make it async, passing its return value to a - * callback. This is useful for plugging sync functions into a waterfall, - * series, or other async functions. Any arguments passed to the generated - * function will be passed to the wrapped function (except for the final - * callback argument). Errors thrown will be passed to the callback. - * - * If the function passed to `asyncify` returns a Promise, that promises's - * resolved/rejected state will be used to call the callback, rather than simply - * the synchronous return value. - * - * This also means you can asyncify ES2017 `async` functions. - * - * @name asyncify - * @static - * @memberOf module:Utils - * @method - * @alias wrapSync - * @category Util - * @param {Function} func - The synchronous function, or Promise-returning - * function to convert to an {@link AsyncFunction}. - * @returns {AsyncFunction} An asynchronous wrapper of the `func`. To be - * invoked with `(args..., callback)`. - * @example - * - * // passing a regular synchronous function - * async.waterfall([ - * async.apply(fs.readFile, filename, "utf8"), - * async.asyncify(JSON.parse), - * function (data, next) { - * // data is the result of parsing the text. - * // If there was a parsing error, it would have been caught. - * } - * ], callback); - * - * // passing a function returning a promise - * async.waterfall([ - * async.apply(fs.readFile, filename, "utf8"), - * async.asyncify(function (contents) { - * return db.model.create(contents); - * }), - * function (model, next) { - * // `model` is the instantiated model object. - * // If there was an error, this function would be skipped. - * } - * ], callback); - * - * // es2017 example, though `asyncify` is not needed if your JS environment - * // supports async functions out of the box - * var q = async.queue(async.asyncify(async function(file) { - * var intermediateStep = await processFile(file); - * return await somePromise(intermediateStep) - * })); - * - * q.push(files); - */ - -exports.setImmediate = setImmediate$1; - -function asyncify(func) { - if (isAsync(func)) { - return function () - /*, callback*/ - { - for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { - args[_key5] = arguments[_key5]; - } - - var callback = args.pop(); - var promise = func.apply(this, args); - return handlePromise(promise, callback); - }; - } - - return initialParams(function (args, callback) { - var result; - - try { - result = func.apply(this, args); - } catch (e) { - return callback(e); - } // if result is Promise object - - - if (result && typeof result.then === 'function') { - return handlePromise(result, callback); - } else { - callback(null, result); - } - }); -} - -function handlePromise(promise, callback) { - return promise.then(function (value) { - invokeCallback(callback, null, value); - }, function (err) { - invokeCallback(callback, err && err.message ? err : new Error(err)); - }); -} - -function invokeCallback(callback, error, value) { - try { - callback(error, value); - } catch (err) { - setImmediate$1(function (e) { - throw e; - }, err); - } -} - -function isAsync(fn) { - return fn[Symbol.toStringTag] === 'AsyncFunction'; -} - -function isAsyncGenerator(fn) { - return fn[Symbol.toStringTag] === 'AsyncGenerator'; -} - -function isAsyncIterable(obj) { - return typeof obj[Symbol.asyncIterator] === 'function'; -} - -function wrapAsync(asyncFn) { - if (typeof asyncFn !== 'function') throw new Error('expected a function'); - return isAsync(asyncFn) ? asyncify(asyncFn) : asyncFn; -} // conditionally promisify a function. -// only return a promise if a callback is omitted - - -function awaitify(asyncFn) { - var arity = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : asyncFn.length; - if (!arity) throw new Error('arity is undefined'); - - function awaitable() { - var _this = this; - - for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) { - args[_key6] = arguments[_key6]; - } - - if (typeof args[arity - 1] === 'function') { - return asyncFn.apply(this, args); - } - - return new Promise(function (resolve, reject) { - args[arity - 1] = function (err) { - if (err) return reject(err); - - for (var _len7 = arguments.length, cbArgs = new Array(_len7 > 1 ? _len7 - 1 : 0), _key7 = 1; _key7 < _len7; _key7++) { - cbArgs[_key7 - 1] = arguments[_key7]; - } - - resolve(cbArgs.length > 1 ? cbArgs : cbArgs[0]); - }; - - asyncFn.apply(_this, args); - }); - } - - Object.defineProperty(awaitable, 'name', { - value: "awaitable(".concat(asyncFn.name, ")") - }); - return awaitable; -} - -function applyEach(eachfn) { - return function applyEach(fns) { - for (var _len8 = arguments.length, callArgs = new Array(_len8 > 1 ? _len8 - 1 : 0), _key8 = 1; _key8 < _len8; _key8++) { - callArgs[_key8 - 1] = arguments[_key8]; - } - - var go = awaitify(function (callback) { - var that = this; - return eachfn(fns, function (fn, cb) { - wrapAsync(fn).apply(that, callArgs.concat(cb)); - }, callback); - }); - return go; - }; -} - -function _asyncMap(eachfn, arr, iteratee, callback) { - arr = arr || []; - var results = []; - var counter = 0; - - var _iteratee = wrapAsync(iteratee); - - return eachfn(arr, function (value, _, iterCb) { - var index = counter++; - - _iteratee(value, function (err, v) { - results[index] = v; - iterCb(err); - }); - }, function (err) { - callback(err, results); - }); -} - -function isArrayLike(value) { - return value && typeof value.length === 'number' && value.length >= 0 && value.length % 1 === 0; -} // A temporary value used to identify if the loop should be broken. -// See #1064, #1293 - - -var breakLoop = {}; - -function once(fn) { - function wrapper() { - if (fn === null) return; - var callFn = fn; - fn = null; - - for (var _len9 = arguments.length, args = new Array(_len9), _key9 = 0; _key9 < _len9; _key9++) { - args[_key9] = arguments[_key9]; - } - - callFn.apply(this, args); - } - - Object.assign(wrapper, fn); - return wrapper; -} - -function getIterator(coll) { - return coll[Symbol.iterator] && coll[Symbol.iterator](); -} - -function createArrayIterator(coll) { - var i = -1; - var len = coll.length; - return function next() { - return ++i < len ? { - value: coll[i], - key: i - } : null; - }; -} - -function createES2015Iterator(iterator) { - var i = -1; - return function next() { - var item = iterator.next(); - if (item.done) return null; - i++; - return { - value: item.value, - key: i - }; - }; -} - -function createObjectIterator(obj) { - var okeys = obj ? Object.keys(obj) : []; - var i = -1; - var len = okeys.length; - return function next() { - var key = okeys[++i]; - return i < len ? { - value: obj[key], - key: key - } : null; - }; -} - -function createIterator(coll) { - if (isArrayLike(coll)) { - return createArrayIterator(coll); - } - - var iterator = getIterator(coll); - return iterator ? createES2015Iterator(iterator) : createObjectIterator(coll); -} - -function onlyOnce(fn) { - return function () { - if (fn === null) throw new Error("Callback was already called."); - var callFn = fn; - fn = null; - - for (var _len10 = arguments.length, args = new Array(_len10), _key10 = 0; _key10 < _len10; _key10++) { - args[_key10] = arguments[_key10]; - } - - callFn.apply(this, args); - }; -} // for async generators - - -function asyncEachOfLimit(generator, limit, iteratee, callback) { - var done = false; - var canceled = false; - var awaiting = false; - var running = 0; - var idx = 0; - - function replenish() { - //console.log('replenish') - if (running >= limit || awaiting || done) return; //console.log('replenish awaiting') - - awaiting = true; - generator.next().then(function (_ref) { - var value = _ref.value, - iterDone = _ref.done; - //console.log('got value', value) - if (canceled || done) return; - awaiting = false; - - if (iterDone) { - done = true; - - if (running <= 0) { - //console.log('done nextCb') - callback(null); - } - - return; - } - - running++; - iteratee(value, idx, iterateeCallback); - idx++; - replenish(); - }).catch(handleError); - } - - function iterateeCallback(err, result) { - //console.log('iterateeCallback') - running -= 1; - if (canceled) return; - if (err) return handleError(err); - - if (err === false) { - done = true; - canceled = true; - return; - } - - if (result === breakLoop || done && running <= 0) { - done = true; //console.log('done iterCb') - - return callback(null); - } - - replenish(); - } - - function handleError(err) { - if (canceled) return; - awaiting = false; - done = true; - callback(err); - } - - replenish(); -} - -var eachOfLimit = function eachOfLimit(limit) { - return function (obj, iteratee, callback) { - callback = once(callback); - - if (limit <= 0) { - throw new RangeError('concurrency limit cannot be less than 1'); - } - - if (!obj) { - return callback(null); - } - - if (isAsyncGenerator(obj)) { - return asyncEachOfLimit(obj, limit, iteratee, callback); - } - - if (isAsyncIterable(obj)) { - return asyncEachOfLimit(obj[Symbol.asyncIterator](), limit, iteratee, callback); - } - - var nextElem = createIterator(obj); - var done = false; - var canceled = false; - var running = 0; - var looping = false; - - function iterateeCallback(err, value) { - if (canceled) return; - running -= 1; - - if (err) { - done = true; - callback(err); - } else if (err === false) { - done = true; - canceled = true; - } else if (value === breakLoop || done && running <= 0) { - done = true; - return callback(null); - } else if (!looping) { - replenish(); - } - } - - function replenish() { - looping = true; - - while (running < limit && !done) { - var elem = nextElem(); - - if (elem === null) { - done = true; - - if (running <= 0) { - callback(null); - } - - return; - } - - running += 1; - iteratee(elem.value, elem.key, onlyOnce(iterateeCallback)); - } - - looping = false; - } - - replenish(); - }; -}; -/** - * The same as [`eachOf`]{@link module:Collections.eachOf} but runs a maximum of `limit` async operations at a - * time. - * - * @name eachOfLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.eachOf]{@link module:Collections.eachOf} - * @alias forEachOfLimit - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - An async function to apply to each - * item in `coll`. The `key` is the item's key, or index in the case of an - * array. - * Invoked with (item, key, callback). - * @param {Function} [callback] - A callback which is called when all - * `iteratee` functions have finished, or an error occurs. Invoked with (err). - * @returns {Promise} a promise, if a callback is omitted - */ - - -function eachOfLimit$1(coll, limit, iteratee, callback) { - return eachOfLimit(limit)(coll, wrapAsync(iteratee), callback); -} - -var eachOfLimit$2 = awaitify(eachOfLimit$1, 4); // eachOf implementation optimized for array-likes - -exports.forEachOfLimit = exports.eachOfLimit = eachOfLimit$2; - -function eachOfArrayLike(coll, iteratee, callback) { - callback = once(callback); - var index = 0, - completed = 0, - length = coll.length, - canceled = false; - - if (length === 0) { - callback(null); - } - - function iteratorCallback(err, value) { - if (err === false) { - canceled = true; - } - - if (canceled === true) return; - - if (err) { - callback(err); - } else if (++completed === length || value === breakLoop) { - callback(null); - } - } - - for (; index < length; index++) { - iteratee(coll[index], index, onlyOnce(iteratorCallback)); - } -} // a generic version of eachOf which can handle array, object, and iterator cases. - - -function eachOfGeneric(coll, iteratee, callback) { - return eachOfLimit$2(coll, Infinity, iteratee, callback); -} -/** - * Like [`each`]{@link module:Collections.each}, except that it passes the key (or index) as the second argument - * to the iteratee. - * - * @name eachOf - * @static - * @memberOf module:Collections - * @method - * @alias forEachOf - * @category Collection - * @see [async.each]{@link module:Collections.each} - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - A function to apply to each - * item in `coll`. - * The `key` is the item's key, or index in the case of an array. - * Invoked with (item, key, callback). - * @param {Function} [callback] - A callback which is called when all - * `iteratee` functions have finished, or an error occurs. Invoked with (err). - * @returns {Promise} a promise, if a callback is omitted - * @example - * - * var obj = {dev: "/dev.json", test: "/test.json", prod: "/prod.json"}; - * var configs = {}; - * - * async.forEachOf(obj, function (value, key, callback) { - * fs.readFile(__dirname + value, "utf8", function (err, data) { - * if (err) return callback(err); - * try { - * configs[key] = JSON.parse(data); - * } catch (e) { - * return callback(e); - * } - * callback(); - * }); - * }, function (err) { - * if (err) console.error(err.message); - * // configs is now a map of JSON data - * doSomethingWith(configs); - * }); - */ - - -function eachOf(coll, iteratee, callback) { - var eachOfImplementation = isArrayLike(coll) ? eachOfArrayLike : eachOfGeneric; - return eachOfImplementation(coll, wrapAsync(iteratee), callback); -} - -var eachOf$1 = awaitify(eachOf, 3); -/** - * Produces a new collection of values by mapping each value in `coll` through - * the `iteratee` function. The `iteratee` is called with an item from `coll` - * and a callback for when it has finished processing. Each of these callback - * takes 2 arguments: an `error`, and the transformed item from `coll`. If - * `iteratee` passes an error to its callback, the main `callback` (for the - * `map` function) is immediately called with the error. - * - * Note, that since this function applies the `iteratee` to each item in - * parallel, there is no guarantee that the `iteratee` functions will complete - * in order. However, the results array will be in the same order as the - * original `coll`. - * - * If `map` is passed an Object, the results will be an Array. The results - * will roughly be in the order of the original Objects' keys (but this can - * vary across JavaScript engines). - * - * @name map - * @static - * @memberOf module:Collections - * @method - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The iteratee should complete with the transformed item. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. Results is an Array of the - * transformed items from the `coll`. Invoked with (err, results). - * @returns {Promise} a promise, if no callback is passed - * @example - * - * async.map(['file1','file2','file3'], fs.stat, function(err, results) { - * // results is now an array of stats for each file - * }); - */ - -exports.forEachOf = exports.eachOf = eachOf$1; - -function map(coll, iteratee, callback) { - return _asyncMap(eachOf$1, coll, iteratee, callback); -} - -var map$1 = awaitify(map, 3); -/** - * Applies the provided arguments to each function in the array, calling - * `callback` after all functions have completed. If you only provide the first - * argument, `fns`, then it will return a function which lets you pass in the - * arguments as if it were a single function call. If more arguments are - * provided, `callback` is required while `args` is still optional. The results - * for each of the applied async functions are passed to the final callback - * as an array. - * - * @name applyEach - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {Array|Iterable|AsyncIterable|Object} fns - A collection of {@link AsyncFunction}s - * to all call with the same arguments - * @param {...*} [args] - any number of separate arguments to pass to the - * function. - * @param {Function} [callback] - the final argument should be the callback, - * called when all functions have completed processing. - * @returns {AsyncFunction} - Returns a function that takes no args other than - * an optional callback, that is the result of applying the `args` to each - * of the functions. - * @example - * - * const appliedFn = async.applyEach([enableSearch, updateSchema], 'bucket') - * - * appliedFn((err, results) => { - * // results[0] is the results for `enableSearch` - * // results[1] is the results for `updateSchema` - * }); - * - * // partial application example: - * async.each( - * buckets, - * async (bucket) => async.applyEach([enableSearch, updateSchema], bucket)(), - * callback - * ); - */ - -exports.map = map$1; -var applyEach$1 = applyEach(map$1); -/** - * The same as [`eachOf`]{@link module:Collections.eachOf} but runs only a single async operation at a time. - * - * @name eachOfSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.eachOf]{@link module:Collections.eachOf} - * @alias forEachOfSeries - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * Invoked with (item, key, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. Invoked with (err). - * @returns {Promise} a promise, if a callback is omitted - */ - -exports.applyEach = applyEach$1; - -function eachOfSeries(coll, iteratee, callback) { - return eachOfLimit$2(coll, 1, iteratee, callback); -} - -var eachOfSeries$1 = awaitify(eachOfSeries, 3); -/** - * The same as [`map`]{@link module:Collections.map} but runs only a single async operation at a time. - * - * @name mapSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.map]{@link module:Collections.map} - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The iteratee should complete with the transformed item. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. Results is an array of the - * transformed items from the `coll`. Invoked with (err, results). - * @returns {Promise} a promise, if no callback is passed - */ - -exports.forEachOfSeries = exports.eachOfSeries = eachOfSeries$1; - -function mapSeries(coll, iteratee, callback) { - return _asyncMap(eachOfSeries$1, coll, iteratee, callback); -} - -var mapSeries$1 = awaitify(mapSeries, 3); -/** - * The same as [`applyEach`]{@link module:ControlFlow.applyEach} but runs only a single async operation at a time. - * - * @name applyEachSeries - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.applyEach]{@link module:ControlFlow.applyEach} - * @category Control Flow - * @param {Array|Iterable|AsyncIterable|Object} fns - A collection of {@link AsyncFunction}s to all - * call with the same arguments - * @param {...*} [args] - any number of separate arguments to pass to the - * function. - * @param {Function} [callback] - the final argument should be the callback, - * called when all functions have completed processing. - * @returns {AsyncFunction} - A function, that when called, is the result of - * appling the `args` to the list of functions. It takes no args, other than - * a callback. - */ - -exports.mapSeries = mapSeries$1; -var applyEachSeries = applyEach(mapSeries$1); -exports.applyEachSeries = applyEachSeries; -var PROMISE_SYMBOL = Symbol('promiseCallback'); - -function promiseCallback() { - var resolve, reject; - - function callback(err) { - if (err) return reject(err); - - for (var _len11 = arguments.length, args = new Array(_len11 > 1 ? _len11 - 1 : 0), _key11 = 1; _key11 < _len11; _key11++) { - args[_key11 - 1] = arguments[_key11]; - } - - resolve(args.length > 1 ? args : args[0]); - } - - callback[PROMISE_SYMBOL] = new Promise(function (res, rej) { - resolve = res, reject = rej; - }); - return callback; -} -/** - * Determines the best order for running the {@link AsyncFunction}s in `tasks`, based on - * their requirements. Each function can optionally depend on other functions - * being completed first, and each function is run as soon as its requirements - * are satisfied. - * - * If any of the {@link AsyncFunction}s pass an error to their callback, the `auto` sequence - * will stop. Further tasks will not execute (so any other functions depending - * on it will not run), and the main `callback` is immediately called with the - * error. - * - * {@link AsyncFunction}s also receive an object containing the results of functions which - * have completed so far as the first argument, if they have dependencies. If a - * task function has no dependencies, it will only be passed a callback. - * - * @name auto - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {Object} tasks - An object. Each of its properties is either a - * function or an array of requirements, with the {@link AsyncFunction} itself the last item - * in the array. The object's key of a property serves as the name of the task - * defined by that property, i.e. can be used when specifying requirements for - * other tasks. The function receives one or two arguments: - * * a `results` object, containing the results of the previously executed - * functions, only passed if the task has any dependencies, - * * a `callback(err, result)` function, which must be called when finished, - * passing an `error` (which can be `null`) and the result of the function's - * execution. - * @param {number} [concurrency=Infinity] - An optional `integer` for - * determining the maximum number of tasks that can be run in parallel. By - * default, as many as possible. - * @param {Function} [callback] - An optional callback which is called when all - * the tasks have been completed. It receives the `err` argument if any `tasks` - * pass an error to their callback. Results are always returned; however, if an - * error occurs, no further `tasks` will be performed, and the results object - * will only contain partial results. Invoked with (err, results). - * @returns {Promise} a promise, if a callback is not passed - * @example - * - * async.auto({ - * // this function will just be passed a callback - * readData: async.apply(fs.readFile, 'data.txt', 'utf-8'), - * showData: ['readData', function(results, cb) { - * // results.readData is the file's contents - * // ... - * }] - * }, callback); - * - * async.auto({ - * get_data: function(callback) { - * console.log('in get_data'); - * // async code to get some data - * callback(null, 'data', 'converted to array'); - * }, - * make_folder: function(callback) { - * console.log('in make_folder'); - * // async code to create a directory to store a file in - * // this is run at the same time as getting the data - * callback(null, 'folder'); - * }, - * write_file: ['get_data', 'make_folder', function(results, callback) { - * console.log('in write_file', JSON.stringify(results)); - * // once there is some data and the directory exists, - * // write the data to a file in the directory - * callback(null, 'filename'); - * }], - * email_link: ['write_file', function(results, callback) { - * console.log('in email_link', JSON.stringify(results)); - * // once the file is written let's email a link to it... - * // results.write_file contains the filename returned by write_file. - * callback(null, {'file':results.write_file, 'email':'user@example.com'}); - * }] - * }, function(err, results) { - * console.log('err = ', err); - * console.log('results = ', results); - * }); - */ - - -function auto(tasks, concurrency, callback) { - if (typeof concurrency !== 'number') { - // concurrency is optional, shift the args. - callback = concurrency; - concurrency = null; - } - - callback = once(callback || promiseCallback()); - var numTasks = Object.keys(tasks).length; - - if (!numTasks) { - return callback(null); - } - - if (!concurrency) { - concurrency = numTasks; - } - - var results = {}; - var runningTasks = 0; - var canceled = false; - var hasError = false; - var listeners = Object.create(null); - var readyTasks = []; // for cycle detection: - - var readyToCheck = []; // tasks that have been identified as reachable - // without the possibility of returning to an ancestor task - - var uncheckedDependencies = {}; - Object.keys(tasks).forEach(function (key) { - var task = tasks[key]; - - if (!Array.isArray(task)) { - // no dependencies - enqueueTask(key, [task]); - readyToCheck.push(key); - return; - } - - var dependencies = task.slice(0, task.length - 1); - var remainingDependencies = dependencies.length; - - if (remainingDependencies === 0) { - enqueueTask(key, task); - readyToCheck.push(key); - return; - } - - uncheckedDependencies[key] = remainingDependencies; - dependencies.forEach(function (dependencyName) { - if (!tasks[dependencyName]) { - throw new Error('async.auto task `' + key + '` has a non-existent dependency `' + dependencyName + '` in ' + dependencies.join(', ')); - } - - addListener(dependencyName, function () { - remainingDependencies--; - - if (remainingDependencies === 0) { - enqueueTask(key, task); - } - }); - }); - }); - checkForDeadlocks(); - processQueue(); - - function enqueueTask(key, task) { - readyTasks.push(function () { - return runTask(key, task); - }); - } - - function processQueue() { - if (canceled) return; - - if (readyTasks.length === 0 && runningTasks === 0) { - return callback(null, results); - } - - while (readyTasks.length && runningTasks < concurrency) { - var run = readyTasks.shift(); - run(); - } - } - - function addListener(taskName, fn) { - var taskListeners = listeners[taskName]; - - if (!taskListeners) { - taskListeners = listeners[taskName] = []; - } - - taskListeners.push(fn); - } - - function taskComplete(taskName) { - var taskListeners = listeners[taskName] || []; - taskListeners.forEach(function (fn) { - return fn(); - }); - processQueue(); - } - - function runTask(key, task) { - if (hasError) return; - var taskCallback = onlyOnce(function (err) { - for (var _len12 = arguments.length, result = new Array(_len12 > 1 ? _len12 - 1 : 0), _key12 = 1; _key12 < _len12; _key12++) { - result[_key12 - 1] = arguments[_key12]; - } - - runningTasks--; - - if (err === false) { - canceled = true; - return; - } - - if (result.length < 2) { - var _result = result; - - var _result2 = _slicedToArray(_result, 1); - - result = _result2[0]; - } - - if (err) { - var safeResults = {}; - Object.keys(results).forEach(function (rkey) { - safeResults[rkey] = results[rkey]; - }); - safeResults[key] = result; - hasError = true; - listeners = Object.create(null); - if (canceled) return; - callback(err, safeResults); - } else { - results[key] = result; - taskComplete(key); - } - }); - runningTasks++; - var taskFn = wrapAsync(task[task.length - 1]); - - if (task.length > 1) { - taskFn(results, taskCallback); - } else { - taskFn(taskCallback); - } - } - - function checkForDeadlocks() { - // Kahn's algorithm - // https://en.wikipedia.org/wiki/Topological_sorting#Kahn.27s_algorithm - // http://connalle.blogspot.com/2013/10/topological-sortingkahn-algorithm.html - var currentTask; - var counter = 0; - - while (readyToCheck.length) { - currentTask = readyToCheck.pop(); - counter++; - getDependents(currentTask).forEach(function (dependent) { - if (--uncheckedDependencies[dependent] === 0) { - readyToCheck.push(dependent); - } - }); - } - - if (counter !== numTasks) { - throw new Error('async.auto cannot execute tasks due to a recursive dependency'); - } - } - - function getDependents(taskName) { - var result = []; - Object.keys(tasks).forEach(function (key) { - var task = tasks[key]; - - if (Array.isArray(task) && task.indexOf(taskName) >= 0) { - result.push(key); - } - }); - return result; - } - - return callback[PROMISE_SYMBOL]; -} - -var FN_ARGS = /^(?:async\s+)?(?:function)?\s*\w*\s*\(\s*([^)]+)\s*\)(?:\s*{)/; -var ARROW_FN_ARGS = /^(?:async\s+)?\(?\s*([^)=]+)\s*\)?(?:\s*=>)/; -var FN_ARG_SPLIT = /,/; -var FN_ARG = /(=.+)?(\s*)$/; -var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; - -function parseParams(func) { - var src = func.toString().replace(STRIP_COMMENTS, ''); - var match = src.match(FN_ARGS); - - if (!match) { - match = src.match(ARROW_FN_ARGS); - } - - if (!match) throw new Error('could not parse args in autoInject\nSource:\n' + src); - - var _match = match, - _match2 = _slicedToArray(_match, 2), - args = _match2[1]; - - return args.replace(/\s/g, '').split(FN_ARG_SPLIT).map(function (arg) { - return arg.replace(FN_ARG, '').trim(); - }); -} -/** - * A dependency-injected version of the [async.auto]{@link module:ControlFlow.auto} function. Dependent - * tasks are specified as parameters to the function, after the usual callback - * parameter, with the parameter names matching the names of the tasks it - * depends on. This can provide even more readable task graphs which can be - * easier to maintain. - * - * If a final callback is specified, the task results are similarly injected, - * specified as named parameters after the initial error parameter. - * - * The autoInject function is purely syntactic sugar and its semantics are - * otherwise equivalent to [async.auto]{@link module:ControlFlow.auto}. - * - * @name autoInject - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.auto]{@link module:ControlFlow.auto} - * @category Control Flow - * @param {Object} tasks - An object, each of whose properties is an {@link AsyncFunction} of - * the form 'func([dependencies...], callback). The object's key of a property - * serves as the name of the task defined by that property, i.e. can be used - * when specifying requirements for other tasks. - * * The `callback` parameter is a `callback(err, result)` which must be called - * when finished, passing an `error` (which can be `null`) and the result of - * the function's execution. The remaining parameters name other tasks on - * which the task is dependent, and the results from those tasks are the - * arguments of those parameters. - * @param {Function} [callback] - An optional callback which is called when all - * the tasks have been completed. It receives the `err` argument if any `tasks` - * pass an error to their callback, and a `results` object with any completed - * task results, similar to `auto`. - * @returns {Promise} a promise, if no callback is passed - * @example - * - * // The example from `auto` can be rewritten as follows: - * async.autoInject({ - * get_data: function(callback) { - * // async code to get some data - * callback(null, 'data', 'converted to array'); - * }, - * make_folder: function(callback) { - * // async code to create a directory to store a file in - * // this is run at the same time as getting the data - * callback(null, 'folder'); - * }, - * write_file: function(get_data, make_folder, callback) { - * // once there is some data and the directory exists, - * // write the data to a file in the directory - * callback(null, 'filename'); - * }, - * email_link: function(write_file, callback) { - * // once the file is written let's email a link to it... - * // write_file contains the filename returned by write_file. - * callback(null, {'file':write_file, 'email':'user@example.com'}); - * } - * }, function(err, results) { - * console.log('err = ', err); - * console.log('email_link = ', results.email_link); - * }); - * - * // If you are using a JS minifier that mangles parameter names, `autoInject` - * // will not work with plain functions, since the parameter names will be - * // collapsed to a single letter identifier. To work around this, you can - * // explicitly specify the names of the parameters your task function needs - * // in an array, similar to Angular.js dependency injection. - * - * // This still has an advantage over plain `auto`, since the results a task - * // depends on are still spread into arguments. - * async.autoInject({ - * //... - * write_file: ['get_data', 'make_folder', function(get_data, make_folder, callback) { - * callback(null, 'filename'); - * }], - * email_link: ['write_file', function(write_file, callback) { - * callback(null, {'file':write_file, 'email':'user@example.com'}); - * }] - * //... - * }, function(err, results) { - * console.log('err = ', err); - * console.log('email_link = ', results.email_link); - * }); - */ - - -function autoInject(tasks, callback) { - var newTasks = {}; - Object.keys(tasks).forEach(function (key) { - var taskFn = tasks[key]; - var params; - var fnIsAsync = isAsync(taskFn); - var hasNoDeps = !fnIsAsync && taskFn.length === 1 || fnIsAsync && taskFn.length === 0; - - if (Array.isArray(taskFn)) { - params = _toConsumableArray(taskFn); - taskFn = params.pop(); - newTasks[key] = params.concat(params.length > 0 ? newTask : taskFn); - } else if (hasNoDeps) { - // no dependencies, use the function as-is - newTasks[key] = taskFn; - } else { - params = parseParams(taskFn); - - if (taskFn.length === 0 && !fnIsAsync && params.length === 0) { - throw new Error("autoInject task functions require explicit parameters."); - } // remove callback param - - - if (!fnIsAsync) params.pop(); - newTasks[key] = params.concat(newTask); - } - - function newTask(results, taskCb) { - var newArgs = params.map(function (name) { - return results[name]; - }); - newArgs.push(taskCb); - wrapAsync(taskFn).apply(void 0, _toConsumableArray(newArgs)); - } - }); - return auto(newTasks, callback); -} // Simple doubly linked list (https://en.wikipedia.org/wiki/Doubly_linked_list) implementation -// used for queues. This implementation assumes that the node provided by the user can be modified -// to adjust the next and last properties. We implement only the minimal functionality -// for queue support. - - -var DLL = -/*#__PURE__*/ -function () { - function DLL() { - _classCallCheck(this, DLL); - - this.head = this.tail = null; - this.length = 0; - } - - _createClass(DLL, [{ - key: "removeLink", - value: function removeLink(node) { - if (node.prev) node.prev.next = node.next;else this.head = node.next; - if (node.next) node.next.prev = node.prev;else this.tail = node.prev; - node.prev = node.next = null; - this.length -= 1; - return node; - } - }, { - key: "empty", - value: function empty() { - while (this.head) { - this.shift(); - } - - return this; - } - }, { - key: "insertAfter", - value: function insertAfter(node, newNode) { - newNode.prev = node; - newNode.next = node.next; - if (node.next) node.next.prev = newNode;else this.tail = newNode; - node.next = newNode; - this.length += 1; - } - }, { - key: "insertBefore", - value: function insertBefore(node, newNode) { - newNode.prev = node.prev; - newNode.next = node; - if (node.prev) node.prev.next = newNode;else this.head = newNode; - node.prev = newNode; - this.length += 1; - } - }, { - key: "unshift", - value: function unshift(node) { - if (this.head) this.insertBefore(this.head, node);else setInitial(this, node); - } - }, { - key: "push", - value: function push(node) { - if (this.tail) this.insertAfter(this.tail, node);else setInitial(this, node); - } - }, { - key: "shift", - value: function shift() { - return this.head && this.removeLink(this.head); - } - }, { - key: "pop", - value: function pop() { - return this.tail && this.removeLink(this.tail); - } - }, { - key: "toArray", - value: function toArray() { - return _toConsumableArray(this); - } - }, { - key: Symbol.iterator, - value: - /*#__PURE__*/ - regeneratorRuntime.mark(function value() { - var cur; - return regeneratorRuntime.wrap(function value$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - cur = this.head; - - case 1: - if (!cur) { - _context.next = 7; - break; - } - - _context.next = 4; - return cur.data; - - case 4: - cur = cur.next; - _context.next = 1; - break; - - case 7: - case "end": - return _context.stop(); - } - } - }, value, this); - }) - }, { - key: "remove", - value: function remove(testFn) { - var curr = this.head; - - while (curr) { - var _curr = curr, - next = _curr.next; - - if (testFn(curr)) { - this.removeLink(curr); - } - - curr = next; - } - - return this; - } - }]); - - return DLL; -}(); - -function setInitial(dll, node) { - dll.length = 1; - dll.head = dll.tail = node; -} - -function queue(worker, concurrency, payload) { - var _q; - - if (concurrency == null) { - concurrency = 1; - } else if (concurrency === 0) { - throw new RangeError('Concurrency must not be zero'); - } - - var _worker = wrapAsync(worker); - - var numRunning = 0; - var _workersList = []; - var events = { - error: [], - drain: [], - saturated: [], - unsaturated: [], - empty: [] - }; - - function on(event, handler) { - events[event].push(handler); - } - - function once(event, handler) { - var handleAndRemove = function handleAndRemove() { - off(event, handleAndRemove); - handler.apply(void 0, arguments); - }; - - events[event].push(handleAndRemove); - } - - function off(event, handler) { - if (!event) return Object.keys(events).forEach(function (ev) { - return events[ev] = []; - }); - if (!handler) return events[event] = []; - events[event] = events[event].filter(function (ev) { - return ev !== handler; - }); - } - - function trigger(event) { - for (var _len13 = arguments.length, args = new Array(_len13 > 1 ? _len13 - 1 : 0), _key13 = 1; _key13 < _len13; _key13++) { - args[_key13 - 1] = arguments[_key13]; - } - - events[event].forEach(function (handler) { - return handler.apply(void 0, args); - }); - } - - var processingScheduled = false; - - function _insert(data, insertAtFront, rejectOnError, callback) { - if (callback != null && typeof callback !== 'function') { - throw new Error('task callback must be a function'); - } - - q.started = true; - var res, rej; - - function promiseCallback(err) { - // we don't care about the error, let the global error handler - // deal with it - if (err) return rejectOnError ? rej(err) : res(); - - for (var _len14 = arguments.length, args = new Array(_len14 > 1 ? _len14 - 1 : 0), _key14 = 1; _key14 < _len14; _key14++) { - args[_key14 - 1] = arguments[_key14]; - } - - if (args.length <= 1) return res(args[0]); - res(args); - } - - var item = { - data: data, - callback: rejectOnError ? promiseCallback : callback || promiseCallback - }; - - if (insertAtFront) { - q._tasks.unshift(item); - } else { - q._tasks.push(item); - } - - if (!processingScheduled) { - processingScheduled = true; - setImmediate$1(function () { - processingScheduled = false; - q.process(); - }); - } - - if (rejectOnError || !callback) { - return new Promise(function (resolve, reject) { - res = resolve; - rej = reject; - }); - } - } - - function _createCB(tasks) { - return function (err) { - numRunning -= 1; - - for (var _len15 = arguments.length, args = new Array(_len15 > 1 ? _len15 - 1 : 0), _key15 = 1; _key15 < _len15; _key15++) { - args[_key15 - 1] = arguments[_key15]; - } - - for (var i = 0, l = tasks.length; i < l; i++) { - var task = tasks[i]; - - var index = _workersList.indexOf(task); - - if (index === 0) { - _workersList.shift(); - } else if (index > 0) { - _workersList.splice(index, 1); - } - - task.callback.apply(task, [err].concat(args)); - - if (err != null) { - trigger('error', err, task.data); - } - } - - if (numRunning <= q.concurrency - q.buffer) { - trigger('unsaturated'); - } - - if (q.idle()) { - trigger('drain'); - } - - q.process(); - }; - } - - function _maybeDrain(data) { - if (data.length === 0 && q.idle()) { - // call drain immediately if there are no tasks - setImmediate$1(function () { - return trigger('drain'); - }); - return true; - } - - return false; - } - - var eventMethod = function eventMethod(name) { - return function (handler) { - if (!handler) { - return new Promise(function (resolve, reject) { - once(name, function (err, data) { - if (err) return reject(err); - resolve(data); - }); - }); - } - - off(name); - on(name, handler); - }; - }; - - var isProcessing = false; - var q = (_q = { - _tasks: new DLL() - }, _defineProperty(_q, Symbol.iterator, - /*#__PURE__*/ - regeneratorRuntime.mark(function _callee() { - return regeneratorRuntime.wrap(function _callee$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - return _context2.delegateYield(q._tasks[Symbol.iterator](), "t0", 1); - - case 1: - case "end": - return _context2.stop(); - } - } - }, _callee); - })), _defineProperty(_q, "concurrency", concurrency), _defineProperty(_q, "payload", payload), _defineProperty(_q, "buffer", concurrency / 4), _defineProperty(_q, "started", false), _defineProperty(_q, "paused", false), _defineProperty(_q, "push", function push(data, callback) { - if (Array.isArray(data)) { - if (_maybeDrain(data)) return; - return data.map(function (datum) { - return _insert(datum, false, false, callback); - }); - } - - return _insert(data, false, false, callback); - }), _defineProperty(_q, "pushAsync", function pushAsync(data, callback) { - if (Array.isArray(data)) { - if (_maybeDrain(data)) return; - return data.map(function (datum) { - return _insert(datum, false, true, callback); - }); - } - - return _insert(data, false, true, callback); - }), _defineProperty(_q, "kill", function kill() { - off(); - - q._tasks.empty(); - }), _defineProperty(_q, "unshift", function unshift(data, callback) { - if (Array.isArray(data)) { - if (_maybeDrain(data)) return; - return data.map(function (datum) { - return _insert(datum, true, false, callback); - }); - } - - return _insert(data, true, false, callback); - }), _defineProperty(_q, "unshiftAsync", function unshiftAsync(data, callback) { - if (Array.isArray(data)) { - if (_maybeDrain(data)) return; - return data.map(function (datum) { - return _insert(datum, true, true, callback); - }); - } - - return _insert(data, true, true, callback); - }), _defineProperty(_q, "remove", function remove(testFn) { - q._tasks.remove(testFn); - }), _defineProperty(_q, "process", function process() { - // Avoid trying to start too many processing operations. This can occur - // when callbacks resolve synchronously (#1267). - if (isProcessing) { - return; - } - - isProcessing = true; - - while (!q.paused && numRunning < q.concurrency && q._tasks.length) { - var tasks = [], - data = []; - var l = q._tasks.length; - if (q.payload) l = Math.min(l, q.payload); - - for (var i = 0; i < l; i++) { - var node = q._tasks.shift(); - - tasks.push(node); - - _workersList.push(node); - - data.push(node.data); - } - - numRunning += 1; - - if (q._tasks.length === 0) { - trigger('empty'); - } - - if (numRunning === q.concurrency) { - trigger('saturated'); - } - - var cb = onlyOnce(_createCB(tasks)); - - _worker(data, cb); - } - - isProcessing = false; - }), _defineProperty(_q, "length", function length() { - return q._tasks.length; - }), _defineProperty(_q, "running", function running() { - return numRunning; - }), _defineProperty(_q, "workersList", function workersList() { - return _workersList; - }), _defineProperty(_q, "idle", function idle() { - return q._tasks.length + numRunning === 0; - }), _defineProperty(_q, "pause", function pause() { - q.paused = true; - }), _defineProperty(_q, "resume", function resume() { - if (q.paused === false) { - return; - } - - q.paused = false; - setImmediate$1(q.process); - }), _q); // define these as fixed properties, so people get useful errors when updating - - Object.defineProperties(q, { - saturated: { - writable: false, - value: eventMethod('saturated') - }, - unsaturated: { - writable: false, - value: eventMethod('unsaturated') - }, - empty: { - writable: false, - value: eventMethod('empty') - }, - drain: { - writable: false, - value: eventMethod('drain') - }, - error: { - writable: false, - value: eventMethod('error') - } - }); - return q; -} -/** - * Creates a `cargo` object with the specified payload. Tasks added to the - * cargo will be processed altogether (up to the `payload` limit). If the - * `worker` is in progress, the task is queued until it becomes available. Once - * the `worker` has completed some tasks, each callback of those tasks is - * called. Check out [these](https://camo.githubusercontent.com/6bbd36f4cf5b35a0f11a96dcd2e97711ffc2fb37/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130382f62626330636662302d356632392d313165322d393734662d3333393763363464633835382e676966) [animations](https://camo.githubusercontent.com/f4810e00e1c5f5f8addbe3e9f49064fd5d102699/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130312f38346339323036362d356632392d313165322d383134662d3964336430323431336266642e676966) - * for how `cargo` and `queue` work. - * - * While [`queue`]{@link module:ControlFlow.queue} passes only one task to one of a group of workers - * at a time, cargo passes an array of tasks to a single worker, repeating - * when the worker is finished. - * - * @name cargo - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.queue]{@link module:ControlFlow.queue} - * @category Control Flow - * @param {AsyncFunction} worker - An asynchronous function for processing an array - * of queued tasks. Invoked with `(tasks, callback)`. - * @param {number} [payload=Infinity] - An optional `integer` for determining - * how many tasks should be processed per round; if omitted, the default is - * unlimited. - * @returns {module:ControlFlow.QueueObject} A cargo object to manage the tasks. Callbacks can - * attached as certain properties to listen for specific events during the - * lifecycle of the cargo and inner queue. - * @example - * - * // create a cargo object with payload 2 - * var cargo = async.cargo(function(tasks, callback) { - * for (var i=0; i 1 ? _len18 - 1 : 0), _key18 = 1; _key18 < _len18; _key18++) { - nextargs[_key18 - 1] = arguments[_key18]; - } - - iterCb(err, nextargs); - })); - }, function (err, results) { - return cb.apply(void 0, [err].concat(_toConsumableArray(results))); - }); - return cb[PROMISE_SYMBOL]; - }; -} -/** - * Creates a function which is a composition of the passed asynchronous - * functions. Each function consumes the return value of the function that - * follows. Composing functions `f()`, `g()`, and `h()` would produce the result - * of `f(g(h()))`, only this version uses callbacks to obtain the return values. - * - * If the last argument to the composed function is not a function, a promise - * is returned when you call it. - * - * Each function is executed with the `this` binding of the composed function. - * - * @name compose - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {...AsyncFunction} functions - the asynchronous functions to compose - * @returns {Function} an asynchronous function that is the composed - * asynchronous `functions` - * @example - * - * function add1(n, callback) { - * setTimeout(function () { - * callback(null, n + 1); - * }, 10); - * } - * - * function mul3(n, callback) { - * setTimeout(function () { - * callback(null, n * 3); - * }, 10); - * } - * - * var add1mul3 = async.compose(mul3, add1); - * add1mul3(4, function (err, result) { - * // result now equals 15 - * }); - */ - - -function compose() { - for (var _len19 = arguments.length, args = new Array(_len19), _key19 = 0; _key19 < _len19; _key19++) { - args[_key19] = arguments[_key19]; - } - - return seq.apply(void 0, _toConsumableArray(args.reverse())); -} -/** - * The same as [`map`]{@link module:Collections.map} but runs a maximum of `limit` async operations at a time. - * - * @name mapLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.map]{@link module:Collections.map} - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The iteratee should complete with the transformed item. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. Results is an array of the - * transformed items from the `coll`. Invoked with (err, results). - * @returns {Promise} a promise, if no callback is passed - */ - - -function mapLimit(coll, limit, iteratee, callback) { - return _asyncMap(eachOfLimit(limit), coll, iteratee, callback); -} - -var mapLimit$1 = awaitify(mapLimit, 4); -/** - * The same as [`concat`]{@link module:Collections.concat} but runs a maximum of `limit` async operations at a time. - * - * @name concatLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.concat]{@link module:Collections.concat} - * @category Collection - * @alias flatMapLimit - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`, - * which should use an array as its result. Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished, or an error occurs. Results is an array - * containing the concatenated results of the `iteratee` function. Invoked with - * (err, results). - * @returns A Promise, if no callback is passed - */ - -exports.mapLimit = mapLimit$1; - -function concatLimit(coll, limit, iteratee, callback) { - var _iteratee = wrapAsync(iteratee); - - return mapLimit$1(coll, limit, function (val, iterCb) { - _iteratee(val, function (err) { - if (err) return iterCb(err); - - for (var _len20 = arguments.length, args = new Array(_len20 > 1 ? _len20 - 1 : 0), _key20 = 1; _key20 < _len20; _key20++) { - args[_key20 - 1] = arguments[_key20]; - } - - return iterCb(err, args); - }); - }, function (err, mapResults) { - var result = []; - - for (var i = 0; i < mapResults.length; i++) { - if (mapResults[i]) { - var _result3; - - result = (_result3 = result).concat.apply(_result3, _toConsumableArray(mapResults[i])); - } - } - - return callback(err, result); - }); -} - -var concatLimit$1 = awaitify(concatLimit, 4); -/** - * Applies `iteratee` to each item in `coll`, concatenating the results. Returns - * the concatenated list. The `iteratee`s are called in parallel, and the - * results are concatenated as they return. The results array will be returned in - * the original order of `coll` passed to the `iteratee` function. - * - * @name concat - * @static - * @memberOf module:Collections - * @method - * @category Collection - * @alias flatMap - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`, - * which should use an array as its result. Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished, or an error occurs. Results is an array - * containing the concatenated results of the `iteratee` function. Invoked with - * (err, results). - * @returns A Promise, if no callback is passed - * @example - * - * async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files) { - * // files is now a list of filenames that exist in the 3 directories - * }); - */ - -exports.flatMapLimit = exports.concatLimit = concatLimit$1; - -function concat(coll, iteratee, callback) { - return concatLimit$1(coll, Infinity, iteratee, callback); -} - -var concat$1 = awaitify(concat, 3); -/** - * The same as [`concat`]{@link module:Collections.concat} but runs only a single async operation at a time. - * - * @name concatSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.concat]{@link module:Collections.concat} - * @category Collection - * @alias flatMapSeries - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - A function to apply to each item in `coll`. - * The iteratee should complete with an array an array of results. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished, or an error occurs. Results is an array - * containing the concatenated results of the `iteratee` function. Invoked with - * (err, results). - * @returns A Promise, if no callback is passed - */ - -exports.flatMap = exports.concat = concat$1; - -function concatSeries(coll, iteratee, callback) { - return concatLimit$1(coll, 1, iteratee, callback); -} - -var concatSeries$1 = awaitify(concatSeries, 3); -/** - * Returns a function that when called, calls-back with the values provided. - * Useful as the first function in a [`waterfall`]{@link module:ControlFlow.waterfall}, or for plugging values in to - * [`auto`]{@link module:ControlFlow.auto}. - * - * @name constant - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {...*} arguments... - Any number of arguments to automatically invoke - * callback with. - * @returns {AsyncFunction} Returns a function that when invoked, automatically - * invokes the callback with the previous given arguments. - * @example - * - * async.waterfall([ - * async.constant(42), - * function (value, next) { - * // value === 42 - * }, - * //... - * ], callback); - * - * async.waterfall([ - * async.constant(filename, "utf8"), - * fs.readFile, - * function (fileData, next) { - * //... - * } - * //... - * ], callback); - * - * async.auto({ - * hostname: async.constant("https://server.net/"), - * port: findFreePort, - * launchServer: ["hostname", "port", function (options, cb) { - * startServer(options, cb); - * }], - * //... - * }, callback); - */ - -exports.flatMapSeries = exports.concatSeries = concatSeries$1; - -function constant() { - for (var _len21 = arguments.length, args = new Array(_len21), _key21 = 0; _key21 < _len21; _key21++) { - args[_key21] = arguments[_key21]; - } - - return function () - /*, callback*/ - { - for (var _len22 = arguments.length, ignoredArgs = new Array(_len22), _key22 = 0; _key22 < _len22; _key22++) { - ignoredArgs[_key22] = arguments[_key22]; - } - - var callback = ignoredArgs.pop(); - return callback.apply(void 0, [null].concat(args)); - }; -} - -function _createTester(check, getResult) { - return function (eachfn, arr, _iteratee, cb) { - var testPassed = false; - var testResult; - var iteratee = wrapAsync(_iteratee); - eachfn(arr, function (value, _, callback) { - iteratee(value, function (err, result) { - if (err || err === false) return callback(err); - - if (check(result) && !testResult) { - testPassed = true; - testResult = getResult(true, value); - return callback(null, breakLoop); - } - - callback(); - }); - }, function (err) { - if (err) return cb(err); - cb(null, testPassed ? testResult : getResult(false)); - }); - }; -} -/** - * Returns the first value in `coll` that passes an async truth test. The - * `iteratee` is applied in parallel, meaning the first iteratee to return - * `true` will fire the detect `callback` with that result. That means the - * result might not be the first item in the original `coll` (in terms of order) - * that passes the test. - - * If order within the original `coll` is important, then look at - * [`detectSeries`]{@link module:Collections.detectSeries}. - * - * @name detect - * @static - * @memberOf module:Collections - * @method - * @alias find - * @category Collections - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`. - * The iteratee must complete with a boolean value as its result. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called as soon as any - * iteratee returns `true`, or after all the `iteratee` functions have finished. - * Result will be the first item in the array that passes the truth test - * (iteratee) or the value `undefined` if none passed. Invoked with - * (err, result). - * @returns A Promise, if no callback is passed - * @example - * - * async.detect(['file1','file2','file3'], function(filePath, callback) { - * fs.access(filePath, function(err) { - * callback(null, !err) - * }); - * }, function(err, result) { - * // result now equals the first file in the list that exists - * }); - */ - - -function detect(coll, iteratee, callback) { - return _createTester(function (bool) { - return bool; - }, function (res, item) { - return item; - })(eachOf$1, coll, iteratee, callback); -} - -var detect$1 = awaitify(detect, 3); -/** - * The same as [`detect`]{@link module:Collections.detect} but runs a maximum of `limit` async operations at a - * time. - * - * @name detectLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.detect]{@link module:Collections.detect} - * @alias findLimit - * @category Collections - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`. - * The iteratee must complete with a boolean value as its result. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called as soon as any - * iteratee returns `true`, or after all the `iteratee` functions have finished. - * Result will be the first item in the array that passes the truth test - * (iteratee) or the value `undefined` if none passed. Invoked with - * (err, result). - * @returns a Promise if no callback is passed - */ - -exports.find = exports.detect = detect$1; - -function detectLimit(coll, limit, iteratee, callback) { - return _createTester(function (bool) { - return bool; - }, function (res, item) { - return item; - })(eachOfLimit(limit), coll, iteratee, callback); -} - -var detectLimit$1 = awaitify(detectLimit, 4); -/** - * The same as [`detect`]{@link module:Collections.detect} but runs only a single async operation at a time. - * - * @name detectSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.detect]{@link module:Collections.detect} - * @alias findSeries - * @category Collections - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`. - * The iteratee must complete with a boolean value as its result. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called as soon as any - * iteratee returns `true`, or after all the `iteratee` functions have finished. - * Result will be the first item in the array that passes the truth test - * (iteratee) or the value `undefined` if none passed. Invoked with - * (err, result). - * @returns a Promise if no callback is passed - */ - -exports.findLimit = exports.detectLimit = detectLimit$1; - -function detectSeries(coll, iteratee, callback) { - return _createTester(function (bool) { - return bool; - }, function (res, item) { - return item; - })(eachOfLimit(1), coll, iteratee, callback); -} - -var detectSeries$1 = awaitify(detectSeries, 3); -exports.findSeries = exports.detectSeries = detectSeries$1; - -function consoleFunc(name) { - return function (fn) { - for (var _len23 = arguments.length, args = new Array(_len23 > 1 ? _len23 - 1 : 0), _key23 = 1; _key23 < _len23; _key23++) { - args[_key23 - 1] = arguments[_key23]; - } - - return wrapAsync(fn).apply(void 0, args.concat([function (err) { - if ((typeof console === "undefined" ? "undefined" : _typeof(console)) === 'object') { - if (err) { - if (console.error) { - console.error(err); - } - } else if (console[name]) { - for (var _len24 = arguments.length, resultArgs = new Array(_len24 > 1 ? _len24 - 1 : 0), _key24 = 1; _key24 < _len24; _key24++) { - resultArgs[_key24 - 1] = arguments[_key24]; - } - - resultArgs.forEach(function (x) { - return console[name](x); - }); - } - } - }])); - }; -} -/** - * Logs the result of an [`async` function]{@link AsyncFunction} to the - * `console` using `console.dir` to display the properties of the resulting object. - * Only works in Node.js or in browsers that support `console.dir` and - * `console.error` (such as FF and Chrome). - * If multiple arguments are returned from the async function, - * `console.dir` is called on each argument in order. - * - * @name dir - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {AsyncFunction} function - The function you want to eventually apply - * all arguments to. - * @param {...*} arguments... - Any number of arguments to apply to the function. - * @example - * - * // in a module - * var hello = function(name, callback) { - * setTimeout(function() { - * callback(null, {hello: name}); - * }, 1000); - * }; - * - * // in the node repl - * node> async.dir(hello, 'world'); - * {hello: 'world'} - */ - - -var dir = consoleFunc('dir'); -/** - * The post-check version of [`whilst`]{@link module:ControlFlow.whilst}. To reflect the difference in - * the order of operations, the arguments `test` and `iteratee` are switched. - * - * `doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript. - * - * @name doWhilst - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.whilst]{@link module:ControlFlow.whilst} - * @category Control Flow - * @param {AsyncFunction} iteratee - A function which is called each time `test` - * passes. Invoked with (callback). - * @param {AsyncFunction} test - asynchronous truth test to perform after each - * execution of `iteratee`. Invoked with (...args, callback), where `...args` are the - * non-error args from the previous callback of `iteratee`. - * @param {Function} [callback] - A callback which is called after the test - * function has failed and repeated execution of `iteratee` has stopped. - * `callback` will be passed an error and any arguments passed to the final - * `iteratee`'s callback. Invoked with (err, [results]); - * @returns {Promise} a promise, if no callback is passed - */ - -exports.dir = dir; - -function doWhilst(iteratee, test, callback) { - callback = onlyOnce(callback); - - var _fn = wrapAsync(iteratee); - - var _test = wrapAsync(test); - - var results; - - function next(err) { - if (err) return callback(err); - if (err === false) return; - - for (var _len25 = arguments.length, args = new Array(_len25 > 1 ? _len25 - 1 : 0), _key25 = 1; _key25 < _len25; _key25++) { - args[_key25 - 1] = arguments[_key25]; - } - - results = args; - - _test.apply(void 0, args.concat([check])); - } - - function check(err, truth) { - if (err) return callback(err); - if (err === false) return; - if (!truth) return callback.apply(void 0, [null].concat(_toConsumableArray(results))); - - _fn(next); - } - - return check(null, true); -} - -var doWhilst$1 = awaitify(doWhilst, 3); -/** - * Like ['doWhilst']{@link module:ControlFlow.doWhilst}, except the `test` is inverted. Note the - * argument ordering differs from `until`. - * - * @name doUntil - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.doWhilst]{@link module:ControlFlow.doWhilst} - * @category Control Flow - * @param {AsyncFunction} iteratee - An async function which is called each time - * `test` fails. Invoked with (callback). - * @param {AsyncFunction} test - asynchronous truth test to perform after each - * execution of `iteratee`. Invoked with (...args, callback), where `...args` are the - * non-error args from the previous callback of `iteratee` - * @param {Function} [callback] - A callback which is called after the test - * function has passed and repeated execution of `iteratee` has stopped. `callback` - * will be passed an error and any arguments passed to the final `iteratee`'s - * callback. Invoked with (err, [results]); - * @returns {Promise} a promise, if no callback is passed - */ - -exports.doDuring = exports.doWhilst = doWhilst$1; - -function doUntil(iteratee, test, callback) { - var _test = wrapAsync(test); - - return doWhilst$1(iteratee, function () { - for (var _len26 = arguments.length, args = new Array(_len26), _key26 = 0; _key26 < _len26; _key26++) { - args[_key26] = arguments[_key26]; - } - - var cb = args.pop(); - - _test.apply(void 0, args.concat([function (err, truth) { - return cb(err, !truth); - }])); - }, callback); -} - -function _withoutIndex(iteratee) { - return function (value, index, callback) { - return iteratee(value, callback); - }; -} -/** - * Applies the function `iteratee` to each item in `coll`, in parallel. - * The `iteratee` is called with an item from the list, and a callback for when - * it has finished. If the `iteratee` passes an error to its `callback`, the - * main `callback` (for the `each` function) is immediately called with the - * error. - * - * Note, that since this function applies `iteratee` to each item in parallel, - * there is no guarantee that the iteratee functions will complete in order. - * - * @name each - * @static - * @memberOf module:Collections - * @method - * @alias forEach - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to - * each item in `coll`. Invoked with (item, callback). - * The array index is not passed to the iteratee. - * If you need the index, use `eachOf`. - * @param {Function} [callback] - A callback which is called when all - * `iteratee` functions have finished, or an error occurs. Invoked with (err). - * @returns {Promise} a promise, if a callback is omitted - * @example - * - * // assuming openFiles is an array of file names and saveFile is a function - * // to save the modified contents of that file: - * - * async.each(openFiles, saveFile, function(err){ - * // if any of the saves produced an error, err would equal that error - * }); - * - * // assuming openFiles is an array of file names - * async.each(openFiles, function(file, callback) { - * - * // Perform operation on file here. - * console.log('Processing file ' + file); - * - * if( file.length > 32 ) { - * console.log('This file name is too long'); - * callback('File name too long'); - * } else { - * // Do work to process file here - * console.log('File processed'); - * callback(); - * } - * }, function(err) { - * // if any of the file processing produced an error, err would equal that error - * if( err ) { - * // One of the iterations produced an error. - * // All processing will now stop. - * console.log('A file failed to process'); - * } else { - * console.log('All files have been processed successfully'); - * } - * }); - */ - - -function eachLimit(coll, iteratee, callback) { - return eachOf$1(coll, _withoutIndex(wrapAsync(iteratee)), callback); -} - -var each = awaitify(eachLimit, 3); -/** - * The same as [`each`]{@link module:Collections.each} but runs a maximum of `limit` async operations at a time. - * - * @name eachLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.each]{@link module:Collections.each} - * @alias forEachLimit - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The array index is not passed to the iteratee. - * If you need the index, use `eachOfLimit`. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called when all - * `iteratee` functions have finished, or an error occurs. Invoked with (err). - * @returns {Promise} a promise, if a callback is omitted - */ - -exports.forEach = exports.each = each; - -function eachLimit$1(coll, limit, iteratee, callback) { - return eachOfLimit(limit)(coll, _withoutIndex(wrapAsync(iteratee)), callback); -} - -var eachLimit$2 = awaitify(eachLimit$1, 4); -/** - * The same as [`each`]{@link module:Collections.each} but runs only a single async operation at a time. - * - * Note, that unlike [`each`]{@link module:Collections.each}, this function applies iteratee to each item - * in series and therefore the iteratee functions will complete in order. - - * @name eachSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.each]{@link module:Collections.each} - * @alias forEachSeries - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to each - * item in `coll`. - * The array index is not passed to the iteratee. - * If you need the index, use `eachOfSeries`. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called when all - * `iteratee` functions have finished, or an error occurs. Invoked with (err). - * @returns {Promise} a promise, if a callback is omitted - */ - -exports.forEachLimit = exports.eachLimit = eachLimit$2; - -function eachSeries(coll, iteratee, callback) { - return eachLimit$2(coll, 1, iteratee, callback); -} - -var eachSeries$1 = awaitify(eachSeries, 3); -/** - * Wrap an async function and ensure it calls its callback on a later tick of - * the event loop. If the function already calls its callback on a next tick, - * no extra deferral is added. This is useful for preventing stack overflows - * (`RangeError: Maximum call stack size exceeded`) and generally keeping - * [Zalgo](http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony) - * contained. ES2017 `async` functions are returned as-is -- they are immune - * to Zalgo's corrupting influences, as they always resolve on a later tick. - * - * @name ensureAsync - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {AsyncFunction} fn - an async function, one that expects a node-style - * callback as its last argument. - * @returns {AsyncFunction} Returns a wrapped function with the exact same call - * signature as the function passed in. - * @example - * - * function sometimesAsync(arg, callback) { - * if (cache[arg]) { - * return callback(null, cache[arg]); // this would be synchronous!! - * } else { - * doSomeIO(arg, callback); // this IO would be asynchronous - * } - * } - * - * // this has a risk of stack overflows if many results are cached in a row - * async.mapSeries(args, sometimesAsync, done); - * - * // this will defer sometimesAsync's callback if necessary, - * // preventing stack overflows - * async.mapSeries(args, async.ensureAsync(sometimesAsync), done); - */ - -exports.forEachSeries = exports.eachSeries = eachSeries$1; - -function ensureAsync(fn) { - if (isAsync(fn)) return fn; - return function () - /*, callback*/ - { - for (var _len27 = arguments.length, args = new Array(_len27), _key27 = 0; _key27 < _len27; _key27++) { - args[_key27] = arguments[_key27]; - } - - var callback = args.pop(); - var sync = true; - args.push(function () { - for (var _len28 = arguments.length, innerArgs = new Array(_len28), _key28 = 0; _key28 < _len28; _key28++) { - innerArgs[_key28] = arguments[_key28]; - } - - if (sync) { - setImmediate$1(function () { - return callback.apply(void 0, innerArgs); - }); - } else { - callback.apply(void 0, innerArgs); - } - }); - fn.apply(this, args); - sync = false; - }; -} -/** - * Returns `true` if every element in `coll` satisfies an async test. If any - * iteratee call returns `false`, the main `callback` is immediately called. - * - * @name every - * @static - * @memberOf module:Collections - * @method - * @alias all - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async truth test to apply to each item - * in the collection in parallel. - * The iteratee must complete with a boolean result value. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Result will be either `true` or `false` - * depending on the values of the async tests. Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - * @example - * - * async.every(['file1','file2','file3'], function(filePath, callback) { - * fs.access(filePath, function(err) { - * callback(null, !err) - * }); - * }, function(err, result) { - * // if result is true then every file exists - * }); - */ - - -function every(coll, iteratee, callback) { - return _createTester(function (bool) { - return !bool; - }, function (res) { - return !res; - })(eachOf$1, coll, iteratee, callback); -} - -var every$1 = awaitify(every, 3); -/** - * The same as [`every`]{@link module:Collections.every} but runs a maximum of `limit` async operations at a time. - * - * @name everyLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.every]{@link module:Collections.every} - * @alias allLimit - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - An async truth test to apply to each item - * in the collection in parallel. - * The iteratee must complete with a boolean result value. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Result will be either `true` or `false` - * depending on the values of the async tests. Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - */ - -exports.all = exports.every = every$1; - -function everyLimit(coll, limit, iteratee, callback) { - return _createTester(function (bool) { - return !bool; - }, function (res) { - return !res; - })(eachOfLimit(limit), coll, iteratee, callback); -} - -var everyLimit$1 = awaitify(everyLimit, 4); -/** - * The same as [`every`]{@link module:Collections.every} but runs only a single async operation at a time. - * - * @name everySeries - * @static - * @memberOf module:Collections - * @method - * @see [async.every]{@link module:Collections.every} - * @alias allSeries - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async truth test to apply to each item - * in the collection in series. - * The iteratee must complete with a boolean result value. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Result will be either `true` or `false` - * depending on the values of the async tests. Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - */ - -exports.allLimit = exports.everyLimit = everyLimit$1; - -function everySeries(coll, iteratee, callback) { - return _createTester(function (bool) { - return !bool; - }, function (res) { - return !res; - })(eachOfSeries$1, coll, iteratee, callback); -} - -var everySeries$1 = awaitify(everySeries, 3); -exports.allSeries = exports.everySeries = everySeries$1; - -function filterArray(eachfn, arr, iteratee, callback) { - var truthValues = new Array(arr.length); - eachfn(arr, function (x, index, iterCb) { - iteratee(x, function (err, v) { - truthValues[index] = !!v; - iterCb(err); - }); - }, function (err) { - if (err) return callback(err); - var results = []; - - for (var i = 0; i < arr.length; i++) { - if (truthValues[i]) results.push(arr[i]); - } - - callback(null, results); - }); -} - -function filterGeneric(eachfn, coll, iteratee, callback) { - var results = []; - eachfn(coll, function (x, index, iterCb) { - iteratee(x, function (err, v) { - if (err) return iterCb(err); - - if (v) { - results.push({ - index: index, - value: x - }); - } - - iterCb(err); - }); - }, function (err) { - if (err) return callback(err); - callback(null, results.sort(function (a, b) { - return a.index - b.index; - }).map(function (v) { - return v.value; - })); - }); -} - -function _filter(eachfn, coll, iteratee, callback) { - var filter = isArrayLike(coll) ? filterArray : filterGeneric; - return filter(eachfn, coll, wrapAsync(iteratee), callback); -} -/** - * Returns a new array of all the values in `coll` which pass an async truth - * test. This operation is performed in parallel, but the results array will be - * in the same order as the original. - * - * @name filter - * @static - * @memberOf module:Collections - * @method - * @alias select - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {Function} iteratee - A truth test to apply to each item in `coll`. - * The `iteratee` is passed a `callback(err, truthValue)`, which must be called - * with a boolean argument once it has completed. Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Invoked with (err, results). - * @returns {Promise} a promise, if no callback provided - * @example - * - * async.filter(['file1','file2','file3'], function(filePath, callback) { - * fs.access(filePath, function(err) { - * callback(null, !err) - * }); - * }, function(err, results) { - * // results now equals an array of the existing files - * }); - */ - - -function filter(coll, iteratee, callback) { - return _filter(eachOf$1, coll, iteratee, callback); -} - -var filter$1 = awaitify(filter, 3); -/** - * The same as [`filter`]{@link module:Collections.filter} but runs a maximum of `limit` async operations at a - * time. - * - * @name filterLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.filter]{@link module:Collections.filter} - * @alias selectLimit - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {Function} iteratee - A truth test to apply to each item in `coll`. - * The `iteratee` is passed a `callback(err, truthValue)`, which must be called - * with a boolean argument once it has completed. Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Invoked with (err, results). - * @returns {Promise} a promise, if no callback provided - */ - -exports.select = exports.filter = filter$1; - -function filterLimit(coll, limit, iteratee, callback) { - return _filter(eachOfLimit(limit), coll, iteratee, callback); -} - -var filterLimit$1 = awaitify(filterLimit, 4); -/** - * The same as [`filter`]{@link module:Collections.filter} but runs only a single async operation at a time. - * - * @name filterSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.filter]{@link module:Collections.filter} - * @alias selectSeries - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {Function} iteratee - A truth test to apply to each item in `coll`. - * The `iteratee` is passed a `callback(err, truthValue)`, which must be called - * with a boolean argument once it has completed. Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Invoked with (err, results) - * @returns {Promise} a promise, if no callback provided - */ - -exports.selectLimit = exports.filterLimit = filterLimit$1; - -function filterSeries(coll, iteratee, callback) { - return _filter(eachOfSeries$1, coll, iteratee, callback); -} - -var filterSeries$1 = awaitify(filterSeries, 3); -/** - * Calls the asynchronous function `fn` with a callback parameter that allows it - * to call itself again, in series, indefinitely. - - * If an error is passed to the callback then `errback` is called with the - * error, and execution stops, otherwise it will never be called. - * - * @name forever - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {AsyncFunction} fn - an async function to call repeatedly. - * Invoked with (next). - * @param {Function} [errback] - when `fn` passes an error to it's callback, - * this function will be called, and execution stops. Invoked with (err). - * @returns {Promise} a promise that rejects if an error occurs and an errback - * is not passed - * @example - * - * async.forever( - * function(next) { - * // next is suitable for passing to things that need a callback(err [, whatever]); - * // it will result in this function being called again. - * }, - * function(err) { - * // if next is called with a value in its first parameter, it will appear - * // in here as 'err', and execution will stop. - * } - * ); - */ - -exports.selectSeries = exports.filterSeries = filterSeries$1; - -function forever(fn, errback) { - var done = onlyOnce(errback); - var task = wrapAsync(ensureAsync(fn)); - - function next(err) { - if (err) return done(err); - if (err === false) return; - task(next); - } - - return next(); -} - -var forever$1 = awaitify(forever, 2); -/** - * The same as [`groupBy`]{@link module:Collections.groupBy} but runs a maximum of `limit` async operations at a time. - * - * @name groupByLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.groupBy]{@link module:Collections.groupBy} - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The iteratee should complete with a `key` to group the value under. - * Invoked with (value, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. Result is an `Object` whoses - * properties are arrays of values which returned the corresponding key. - * @returns {Promise} a promise, if no callback is passed - */ - -exports.forever = forever$1; - -function groupByLimit(coll, limit, iteratee, callback) { - var _iteratee = wrapAsync(iteratee); - - return mapLimit$1(coll, limit, function (val, iterCb) { - _iteratee(val, function (err, key) { - if (err) return iterCb(err); - return iterCb(err, { - key: key, - val: val - }); - }); - }, function (err, mapResults) { - var result = {}; // from MDN, handle object having an `hasOwnProperty` prop - - var hasOwnProperty = Object.prototype.hasOwnProperty; - - for (var i = 0; i < mapResults.length; i++) { - if (mapResults[i]) { - var key = mapResults[i].key; - var val = mapResults[i].val; - - if (hasOwnProperty.call(result, key)) { - result[key].push(val); - } else { - result[key] = [val]; - } - } - } - - return callback(err, result); - }); -} - -var groupByLimit$1 = awaitify(groupByLimit, 4); -/** - * Returns a new object, where each value corresponds to an array of items, from - * `coll`, that returned the corresponding key. That is, the keys of the object - * correspond to the values passed to the `iteratee` callback. - * - * Note: Since this function applies the `iteratee` to each item in parallel, - * there is no guarantee that the `iteratee` functions will complete in order. - * However, the values for each key in the `result` will be in the same order as - * the original `coll`. For Objects, the values will roughly be in the order of - * the original Objects' keys (but this can vary across JavaScript engines). - * - * @name groupBy - * @static - * @memberOf module:Collections - * @method - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The iteratee should complete with a `key` to group the value under. - * Invoked with (value, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. Result is an `Object` whoses - * properties are arrays of values which returned the corresponding key. - * @returns {Promise} a promise, if no callback is passed - * @example - * - * async.groupBy(['userId1', 'userId2', 'userId3'], function(userId, callback) { - * db.findById(userId, function(err, user) { - * if (err) return callback(err); - * return callback(null, user.age); - * }); - * }, function(err, result) { - * // result is object containing the userIds grouped by age - * // e.g. { 30: ['userId1', 'userId3'], 42: ['userId2']}; - * }); - */ - -exports.groupByLimit = groupByLimit$1; - -function groupBy(coll, iteratee, callback) { - return groupByLimit$1(coll, Infinity, iteratee, callback); -} -/** - * The same as [`groupBy`]{@link module:Collections.groupBy} but runs only a single async operation at a time. - * - * @name groupBySeries - * @static - * @memberOf module:Collections - * @method - * @see [async.groupBy]{@link module:Collections.groupBy} - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The iteratee should complete with a `key` to group the value under. - * Invoked with (value, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. Result is an `Object` whoses - * properties are arrays of values which returned the corresponding key. - * @returns {Promise} a promise, if no callback is passed - */ - - -function groupBySeries(coll, iteratee, callback) { - return groupByLimit$1(coll, 1, iteratee, callback); -} -/** - * Logs the result of an `async` function to the `console`. Only works in - * Node.js or in browsers that support `console.log` and `console.error` (such - * as FF and Chrome). If multiple arguments are returned from the async - * function, `console.log` is called on each argument in order. - * - * @name log - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {AsyncFunction} function - The function you want to eventually apply - * all arguments to. - * @param {...*} arguments... - Any number of arguments to apply to the function. - * @example - * - * // in a module - * var hello = function(name, callback) { - * setTimeout(function() { - * callback(null, 'hello ' + name); - * }, 1000); - * }; - * - * // in the node repl - * node> async.log(hello, 'world'); - * 'hello world' - */ - - -var log = consoleFunc('log'); -/** - * The same as [`mapValues`]{@link module:Collections.mapValues} but runs a maximum of `limit` async operations at a - * time. - * - * @name mapValuesLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.mapValues]{@link module:Collections.mapValues} - * @category Collection - * @param {Object} obj - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - A function to apply to each value and key - * in `coll`. - * The iteratee should complete with the transformed value as its result. - * Invoked with (value, key, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. `result` is a new object consisting - * of each key from `obj`, with each transformed value on the right-hand side. - * Invoked with (err, result). - * @returns {Promise} a promise, if no callback is passed - */ - -exports.log = log; - -function mapValuesLimit(obj, limit, iteratee, callback) { - callback = once(callback); - var newObj = {}; - - var _iteratee = wrapAsync(iteratee); - - return eachOfLimit(limit)(obj, function (val, key, next) { - _iteratee(val, key, function (err, result) { - if (err) return next(err); - newObj[key] = result; - next(err); - }); - }, function (err) { - return callback(err, newObj); - }); -} - -var mapValuesLimit$1 = awaitify(mapValuesLimit, 4); -/** - * A relative of [`map`]{@link module:Collections.map}, designed for use with objects. - * - * Produces a new Object by mapping each value of `obj` through the `iteratee` - * function. The `iteratee` is called each `value` and `key` from `obj` and a - * callback for when it has finished processing. Each of these callbacks takes - * two arguments: an `error`, and the transformed item from `obj`. If `iteratee` - * passes an error to its callback, the main `callback` (for the `mapValues` - * function) is immediately called with the error. - * - * Note, the order of the keys in the result is not guaranteed. The keys will - * be roughly in the order they complete, (but this is very engine-specific) - * - * @name mapValues - * @static - * @memberOf module:Collections - * @method - * @category Collection - * @param {Object} obj - A collection to iterate over. - * @param {AsyncFunction} iteratee - A function to apply to each value and key - * in `coll`. - * The iteratee should complete with the transformed value as its result. - * Invoked with (value, key, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. `result` is a new object consisting - * of each key from `obj`, with each transformed value on the right-hand side. - * Invoked with (err, result). - * @returns {Promise} a promise, if no callback is passed - * @example - * - * async.mapValues({ - * f1: 'file1', - * f2: 'file2', - * f3: 'file3' - * }, function (file, key, callback) { - * fs.stat(file, callback); - * }, function(err, result) { - * // result is now a map of stats for each file, e.g. - * // { - * // f1: [stats for file1], - * // f2: [stats for file2], - * // f3: [stats for file3] - * // } - * }); - */ - -exports.mapValuesLimit = mapValuesLimit$1; - -function mapValues(obj, iteratee, callback) { - return mapValuesLimit$1(obj, Infinity, iteratee, callback); -} -/** - * The same as [`mapValues`]{@link module:Collections.mapValues} but runs only a single async operation at a time. - * - * @name mapValuesSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.mapValues]{@link module:Collections.mapValues} - * @category Collection - * @param {Object} obj - A collection to iterate over. - * @param {AsyncFunction} iteratee - A function to apply to each value and key - * in `coll`. - * The iteratee should complete with the transformed value as its result. - * Invoked with (value, key, callback). - * @param {Function} [callback] - A callback which is called when all `iteratee` - * functions have finished, or an error occurs. `result` is a new object consisting - * of each key from `obj`, with each transformed value on the right-hand side. - * Invoked with (err, result). - * @returns {Promise} a promise, if no callback is passed - */ - - -function mapValuesSeries(obj, iteratee, callback) { - return mapValuesLimit$1(obj, 1, iteratee, callback); -} -/** - * Caches the results of an async function. When creating a hash to store - * function results against, the callback is omitted from the hash and an - * optional hash function can be used. - * - * **Note: if the async function errs, the result will not be cached and - * subsequent calls will call the wrapped function.** - * - * If no hash function is specified, the first argument is used as a hash key, - * which may work reasonably if it is a string or a data type that converts to a - * distinct string. Note that objects and arrays will not behave reasonably. - * Neither will cases where the other arguments are significant. In such cases, - * specify your own hash function. - * - * The cache of results is exposed as the `memo` property of the function - * returned by `memoize`. - * - * @name memoize - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {AsyncFunction} fn - The async function to proxy and cache results from. - * @param {Function} hasher - An optional function for generating a custom hash - * for storing results. It has all the arguments applied to it apart from the - * callback, and must be synchronous. - * @returns {AsyncFunction} a memoized version of `fn` - * @example - * - * var slow_fn = function(name, callback) { - * // do something - * callback(null, result); - * }; - * var fn = async.memoize(slow_fn); - * - * // fn can now be used as if it were slow_fn - * fn('some name', function() { - * // callback - * }); - */ - - -function memoize(fn) { - var hasher = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (v) { - return v; - }; - var memo = Object.create(null); - var queues = Object.create(null); - - var _fn = wrapAsync(fn); - - var memoized = initialParams(function (args, callback) { - var key = hasher.apply(void 0, _toConsumableArray(args)); - - if (key in memo) { - setImmediate$1(function () { - return callback.apply(void 0, [null].concat(_toConsumableArray(memo[key]))); - }); - } else if (key in queues) { - queues[key].push(callback); - } else { - queues[key] = [callback]; - - _fn.apply(void 0, _toConsumableArray(args).concat([function (err) { - for (var _len29 = arguments.length, resultArgs = new Array(_len29 > 1 ? _len29 - 1 : 0), _key29 = 1; _key29 < _len29; _key29++) { - resultArgs[_key29 - 1] = arguments[_key29]; - } - - // #1465 don't memoize if an error occurred - if (!err) { - memo[key] = resultArgs; - } - - var q = queues[key]; - delete queues[key]; - - for (var i = 0, l = q.length; i < l; i++) { - q[i].apply(q, [err].concat(resultArgs)); - } - }])); - } - }); - memoized.memo = memo; - memoized.unmemoized = fn; - return memoized; -} -/** - * Calls `callback` on a later loop around the event loop. In Node.js this just - * calls `process.nextTick`. In the browser it will use `setImmediate` if - * available, otherwise `setTimeout(callback, 0)`, which means other higher - * priority events may precede the execution of `callback`. - * - * This is used internally for browser-compatibility purposes. - * - * @name nextTick - * @static - * @memberOf module:Utils - * @method - * @see [async.setImmediate]{@link module:Utils.setImmediate} - * @category Util - * @param {Function} callback - The function to call on a later loop around - * the event loop. Invoked with (args...). - * @param {...*} args... - any number of additional arguments to pass to the - * callback on the next tick. - * @example - * - * var call_order = []; - * async.nextTick(function() { - * call_order.push('two'); - * // call_order now equals ['one','two'] - * }); - * call_order.push('one'); - * - * async.setImmediate(function (a, b, c) { - * // a, b, and c equal 1, 2, and 3 - * }, 1, 2, 3); - */ - - -var _defer$1; - -if (hasNextTick) { - _defer$1 = process.nextTick; -} else if (hasSetImmediate) { - _defer$1 = setImmediate; -} else { - _defer$1 = fallback; -} - -var nextTick = wrap(_defer$1); -exports.nextTick = nextTick; - -var _parallel = awaitify(function (eachfn, tasks, callback) { - var results = isArrayLike(tasks) ? [] : {}; - eachfn(tasks, function (task, key, taskCb) { - wrapAsync(task)(function (err) { - for (var _len30 = arguments.length, result = new Array(_len30 > 1 ? _len30 - 1 : 0), _key30 = 1; _key30 < _len30; _key30++) { - result[_key30 - 1] = arguments[_key30]; - } - - if (result.length < 2) { - var _result4 = result; - - var _result5 = _slicedToArray(_result4, 1); - - result = _result5[0]; - } - - results[key] = result; - taskCb(err); - }); - }, function (err) { - return callback(err, results); - }); -}, 3); -/** - * Run the `tasks` collection of functions in parallel, without waiting until - * the previous function has completed. If any of the functions pass an error to - * its callback, the main `callback` is immediately called with the value of the - * error. Once the `tasks` have completed, the results are passed to the final - * `callback` as an array. - * - * **Note:** `parallel` is about kicking-off I/O tasks in parallel, not about - * parallel execution of code. If your tasks do not use any timers or perform - * any I/O, they will actually be executed in series. Any synchronous setup - * sections for each task will happen one after the other. JavaScript remains - * single-threaded. - * - * **Hint:** Use [`reflect`]{@link module:Utils.reflect} to continue the - * execution of other tasks when a task fails. - * - * It is also possible to use an object instead of an array. Each property will - * be run as a function and the results will be passed to the final `callback` - * as an object instead of an array. This can be a more readable way of handling - * results from {@link async.parallel}. - * - * @name parallel - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection of - * [async functions]{@link AsyncFunction} to run. - * Each async function can complete with any number of optional `result` values. - * @param {Function} [callback] - An optional callback to run once all the - * functions have completed successfully. This function gets a results array - * (or object) containing all the result arguments passed to the task callbacks. - * Invoked with (err, results). - * @returns {Promise} a promise, if a callback is not passed - * - * @example - * async.parallel([ - * function(callback) { - * setTimeout(function() { - * callback(null, 'one'); - * }, 200); - * }, - * function(callback) { - * setTimeout(function() { - * callback(null, 'two'); - * }, 100); - * } - * ], - * // optional callback - * function(err, results) { - * // the results array will equal ['one','two'] even though - * // the second function had a shorter timeout. - * }); - * - * // an example using an object instead of an array - * async.parallel({ - * one: function(callback) { - * setTimeout(function() { - * callback(null, 1); - * }, 200); - * }, - * two: function(callback) { - * setTimeout(function() { - * callback(null, 2); - * }, 100); - * } - * }, function(err, results) { - * // results is now equals to: {one: 1, two: 2} - * }); - */ - - -function parallel(tasks, callback) { - return _parallel(eachOf$1, tasks, callback); -} -/** - * The same as [`parallel`]{@link module:ControlFlow.parallel} but runs a maximum of `limit` async operations at a - * time. - * - * @name parallelLimit - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.parallel]{@link module:ControlFlow.parallel} - * @category Control Flow - * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection of - * [async functions]{@link AsyncFunction} to run. - * Each async function can complete with any number of optional `result` values. - * @param {number} limit - The maximum number of async operations at a time. - * @param {Function} [callback] - An optional callback to run once all the - * functions have completed successfully. This function gets a results array - * (or object) containing all the result arguments passed to the task callbacks. - * Invoked with (err, results). - * @returns {Promise} a promise, if a callback is not passed - */ - - -function parallelLimit(tasks, limit, callback) { - return _parallel(eachOfLimit(limit), tasks, callback); -} -/** - * A queue of tasks for the worker function to complete. - * @typedef {Iterable} QueueObject - * @memberOf module:ControlFlow - * @property {Function} length - a function returning the number of items - * waiting to be processed. Invoke with `queue.length()`. - * @property {boolean} started - a boolean indicating whether or not any - * items have been pushed and processed by the queue. - * @property {Function} running - a function returning the number of items - * currently being processed. Invoke with `queue.running()`. - * @property {Function} workersList - a function returning the array of items - * currently being processed. Invoke with `queue.workersList()`. - * @property {Function} idle - a function returning false if there are items - * waiting or being processed, or true if not. Invoke with `queue.idle()`. - * @property {number} concurrency - an integer for determining how many `worker` - * functions should be run in parallel. This property can be changed after a - * `queue` is created to alter the concurrency on-the-fly. - * @property {number} payload - an integer that specifies how many items are - * passed to the worker function at a time. only applies if this is a - * [cargo]{@link module:ControlFlow.cargo} object - * @property {AsyncFunction} push - add a new task to the `queue`. Calls `callback` - * once the `worker` has finished processing the task. Instead of a single task, - * a `tasks` array can be submitted. The respective callback is used for every - * task in the list. Invoke with `queue.push(task, [callback])`, - * @property {AsyncFunction} unshift - add a new task to the front of the `queue`. - * Invoke with `queue.unshift(task, [callback])`. - * @property {AsyncFunction} pushAsync - the same as `q.push`, except this returns - * a promise that rejects if an error occurs. - * @property {AsyncFunction} unshirtAsync - the same as `q.unshift`, except this returns - * a promise that rejects if an error occurs. - * @property {Function} remove - remove items from the queue that match a test - * function. The test function will be passed an object with a `data` property, - * and a `priority` property, if this is a - * [priorityQueue]{@link module:ControlFlow.priorityQueue} object. - * Invoked with `queue.remove(testFn)`, where `testFn` is of the form - * `function ({data, priority}) {}` and returns a Boolean. - * @property {Function} saturated - a function that sets a callback that is - * called when the number of running workers hits the `concurrency` limit, and - * further tasks will be queued. If the callback is omitted, `q.saturated()` - * returns a promise for the next occurrence. - * @property {Function} unsaturated - a function that sets a callback that is - * called when the number of running workers is less than the `concurrency` & - * `buffer` limits, and further tasks will not be queued. If the callback is - * omitted, `q.unsaturated()` returns a promise for the next occurrence. - * @property {number} buffer - A minimum threshold buffer in order to say that - * the `queue` is `unsaturated`. - * @property {Function} empty - a function that sets a callback that is called - * when the last item from the `queue` is given to a `worker`. If the callback - * is omitted, `q.empty()` returns a promise for the next occurrence. - * @property {Function} drain - a function that sets a callback that is called - * when the last item from the `queue` has returned from the `worker`. If the - * callback is omitted, `q.drain()` returns a promise for the next occurrence. - * @property {Function} error - a function that sets a callback that is called - * when a task errors. Has the signature `function(error, task)`. If the - * callback is omitted, `error()` returns a promise that rejects on the next - * error. - * @property {boolean} paused - a boolean for determining whether the queue is - * in a paused state. - * @property {Function} pause - a function that pauses the processing of tasks - * until `resume()` is called. Invoke with `queue.pause()`. - * @property {Function} resume - a function that resumes the processing of - * queued tasks when the queue is paused. Invoke with `queue.resume()`. - * @property {Function} kill - a function that removes the `drain` callback and - * empties remaining tasks from the queue forcing it to go idle. No more tasks - * should be pushed to the queue after calling this function. Invoke with `queue.kill()`. - * - * @example - * const q = aync.queue(worker, 2) - * q.push(item1) - * q.push(item2) - * q.push(item3) - * // queues are iterable, spread into an array to inspect - * const items = [...q] // [item1, item2, item3] - * // or use for of - * for (let item of q) { - * console.log(item) - * } - * - * q.drain(() => { - * console.log('all done') - * }) - * // or - * await q.drain() - */ - -/** - * Creates a `queue` object with the specified `concurrency`. Tasks added to the - * `queue` are processed in parallel (up to the `concurrency` limit). If all - * `worker`s are in progress, the task is queued until one becomes available. - * Once a `worker` completes a `task`, that `task`'s callback is called. - * - * @name queue - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {AsyncFunction} worker - An async function for processing a queued task. - * If you want to handle errors from an individual task, pass a callback to - * `q.push()`. Invoked with (task, callback). - * @param {number} [concurrency=1] - An `integer` for determining how many - * `worker` functions should be run in parallel. If omitted, the concurrency - * defaults to `1`. If the concurrency is `0`, an error is thrown. - * @returns {module:ControlFlow.QueueObject} A queue object to manage the tasks. Callbacks can be - * attached as certain properties to listen for specific events during the - * lifecycle of the queue. - * @example - * - * // create a queue object with concurrency 2 - * var q = async.queue(function(task, callback) { - * console.log('hello ' + task.name); - * callback(); - * }, 2); - * - * // assign a callback - * q.drain(function() { - * console.log('all items have been processed'); - * }); - * // or await the end - * await q.drain() - * - * // assign an error callback - * q.error(function(err, task) { - * console.error('task experienced an error'); - * }); - * - * // add some items to the queue - * q.push({name: 'foo'}, function(err) { - * console.log('finished processing foo'); - * }); - * // callback is optional - * q.push({name: 'bar'}); - * - * // add some items to the queue (batch-wise) - * q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function(err) { - * console.log('finished processing item'); - * }); - * - * // add some items to the front of the queue - * q.unshift({name: 'bar'}, function (err) { - * console.log('finished processing bar'); - * }); - */ - - -function queue$1(worker, concurrency) { - var _worker = wrapAsync(worker); - - return queue(function (items, cb) { - _worker(items[0], cb); - }, concurrency, 1); -} // Binary min-heap implementation used for priority queue. -// Implementation is stable, i.e. push time is considered for equal priorities - - -var Heap = -/*#__PURE__*/ -function () { - function Heap() { - _classCallCheck(this, Heap); - - this.heap = []; - this.pushCount = Number.MIN_SAFE_INTEGER; - } - - _createClass(Heap, [{ - key: "empty", - value: function empty() { - this.heap = []; - return this; - } - }, { - key: "percUp", - value: function percUp(index) { - var p; - - while (index > 0 && smaller(this.heap[index], this.heap[p = parent(index)])) { - var t = this.heap[index]; - this.heap[index] = this.heap[p]; - this.heap[p] = t; - index = p; - } - } - }, { - key: "percDown", - value: function percDown(index) { - var l; - - while ((l = leftChi(index)) < this.heap.length) { - if (l + 1 < this.heap.length && smaller(this.heap[l + 1], this.heap[l])) { - l = l + 1; - } - - if (smaller(this.heap[index], this.heap[l])) { - break; - } - - var t = this.heap[index]; - this.heap[index] = this.heap[l]; - this.heap[l] = t; - index = l; - } - } - }, { - key: "push", - value: function push(node) { - node.pushCount = ++this.pushCount; - this.heap.push(node); - this.percUp(this.heap.length - 1); - } - }, { - key: "unshift", - value: function unshift(node) { - return this.heap.push(node); - } - }, { - key: "shift", - value: function shift() { - var _this$heap = _slicedToArray(this.heap, 1), - top = _this$heap[0]; - - this.heap[0] = this.heap[this.heap.length - 1]; - this.heap.pop(); - this.percDown(0); - return top; - } - }, { - key: "toArray", - value: function toArray() { - return _toConsumableArray(this); - } - }, { - key: Symbol.iterator, - value: - /*#__PURE__*/ - regeneratorRuntime.mark(function value() { - var i; - return regeneratorRuntime.wrap(function value$(_context3) { - while (1) { - switch (_context3.prev = _context3.next) { - case 0: - i = 0; - - case 1: - if (!(i < this.heap.length)) { - _context3.next = 7; - break; - } - - _context3.next = 4; - return this.heap[i].data; - - case 4: - i++; - _context3.next = 1; - break; - - case 7: - case "end": - return _context3.stop(); - } - } - }, value, this); - }) - }, { - key: "remove", - value: function remove(testFn) { - var j = 0; - - for (var i = 0; i < this.heap.length; i++) { - if (!testFn(this.heap[i])) { - this.heap[j] = this.heap[i]; - j++; - } - } - - this.heap.splice(j); - - for (var _i2 = parent(this.heap.length - 1); _i2 >= 0; _i2--) { - this.percDown(_i2); - } - - return this; - } - }, { - key: "length", - get: function get() { - return this.heap.length; - } - }]); - - return Heap; -}(); - -function leftChi(i) { - return (i << 1) + 1; -} - -function parent(i) { - return (i + 1 >> 1) - 1; -} - -function smaller(x, y) { - if (x.priority !== y.priority) { - return x.priority < y.priority; - } else { - return x.pushCount < y.pushCount; - } -} -/** - * The same as [async.queue]{@link module:ControlFlow.queue} only tasks are assigned a priority and - * completed in ascending priority order. - * - * @name priorityQueue - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.queue]{@link module:ControlFlow.queue} - * @category Control Flow - * @param {AsyncFunction} worker - An async function for processing a queued task. - * If you want to handle errors from an individual task, pass a callback to - * `q.push()`. - * Invoked with (task, callback). - * @param {number} concurrency - An `integer` for determining how many `worker` - * functions should be run in parallel. If omitted, the concurrency defaults to - * `1`. If the concurrency is `0`, an error is thrown. - * @returns {module:ControlFlow.QueueObject} A priorityQueue object to manage the tasks. There are two - * differences between `queue` and `priorityQueue` objects: - * * `push(task, priority, [callback])` - `priority` should be a number. If an - * array of `tasks` is given, all tasks will be assigned the same priority. - * * The `unshift` method was removed. - */ - - -function priorityQueue(worker, concurrency) { - // Start with a normal queue - var q = queue$1(worker, concurrency); - q._tasks = new Heap(); // Override push to accept second parameter representing priority - - q.push = function (data) { - var priority = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; - var callback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {}; - - if (typeof callback !== 'function') { - throw new Error('task callback must be a function'); - } - - q.started = true; - - if (!Array.isArray(data)) { - data = [data]; - } - - if (data.length === 0 && q.idle()) { - // call drain immediately if there are no tasks - return setImmediate$1(function () { - return q.drain(); - }); - } - - for (var i = 0, l = data.length; i < l; i++) { - var item = { - data: data[i], - priority: priority, - callback: callback - }; - - q._tasks.push(item); - } - - setImmediate$1(q.process); - }; // Remove unshift function - - - delete q.unshift; - return q; -} -/** - * Runs the `tasks` array of functions in parallel, without waiting until the - * previous function has completed. Once any of the `tasks` complete or pass an - * error to its callback, the main `callback` is immediately called. It's - * equivalent to `Promise.race()`. - * - * @name race - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {Array} tasks - An array containing [async functions]{@link AsyncFunction} - * to run. Each function can complete with an optional `result` value. - * @param {Function} callback - A callback to run once any of the functions have - * completed. This function gets an error or result from the first function that - * completed. Invoked with (err, result). - * @returns undefined - * @example - * - * async.race([ - * function(callback) { - * setTimeout(function() { - * callback(null, 'one'); - * }, 200); - * }, - * function(callback) { - * setTimeout(function() { - * callback(null, 'two'); - * }, 100); - * } - * ], - * // main callback - * function(err, result) { - * // the result will be equal to 'two' as it finishes earlier - * }); - */ - - -function race(tasks, callback) { - callback = once(callback); - if (!Array.isArray(tasks)) return callback(new TypeError('First argument to race must be an array of functions')); - if (!tasks.length) return callback(); - - for (var i = 0, l = tasks.length; i < l; i++) { - wrapAsync(tasks[i])(callback); - } -} - -var race$1 = awaitify(race, 2); -/** - * Same as [`reduce`]{@link module:Collections.reduce}, only operates on `array` in reverse order. - * - * @name reduceRight - * @static - * @memberOf module:Collections - * @method - * @see [async.reduce]{@link module:Collections.reduce} - * @alias foldr - * @category Collection - * @param {Array} array - A collection to iterate over. - * @param {*} memo - The initial state of the reduction. - * @param {AsyncFunction} iteratee - A function applied to each item in the - * array to produce the next step in the reduction. - * The `iteratee` should complete with the next state of the reduction. - * If the iteratee complete with an error, the reduction is stopped and the - * main `callback` is immediately called with the error. - * Invoked with (memo, item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Result is the reduced value. Invoked with - * (err, result). - * @returns {Promise} a promise, if no callback is passed - */ - -exports.race = race$1; - -function reduceRight(array, memo, iteratee, callback) { - var reversed = _toConsumableArray(array).reverse(); - - return reduce$1(reversed, memo, iteratee, callback); -} -/** - * Wraps the async function in another function that always completes with a - * result object, even when it errors. - * - * The result object has either the property `error` or `value`. - * - * @name reflect - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {AsyncFunction} fn - The async function you want to wrap - * @returns {Function} - A function that always passes null to it's callback as - * the error. The second argument to the callback will be an `object` with - * either an `error` or a `value` property. - * @example - * - * async.parallel([ - * async.reflect(function(callback) { - * // do some stuff ... - * callback(null, 'one'); - * }), - * async.reflect(function(callback) { - * // do some more stuff but error ... - * callback('bad stuff happened'); - * }), - * async.reflect(function(callback) { - * // do some more stuff ... - * callback(null, 'two'); - * }) - * ], - * // optional callback - * function(err, results) { - * // values - * // results[0].value = 'one' - * // results[1].error = 'bad stuff happened' - * // results[2].value = 'two' - * }); - */ - - -function reflect(fn) { - var _fn = wrapAsync(fn); - - return initialParams(function reflectOn(args, reflectCallback) { - args.push(function (error) { - var retVal = {}; - - if (error) { - retVal.error = error; - } - - for (var _len31 = arguments.length, cbArgs = new Array(_len31 > 1 ? _len31 - 1 : 0), _key31 = 1; _key31 < _len31; _key31++) { - cbArgs[_key31 - 1] = arguments[_key31]; - } - - if (cbArgs.length > 0) { - var value = cbArgs; - - if (cbArgs.length <= 1) { - value = cbArgs[0]; - } - - retVal.value = value; - } - - reflectCallback(null, retVal); - }); - return _fn.apply(this, args); - }); -} -/** - * A helper function that wraps an array or an object of functions with `reflect`. - * - * @name reflectAll - * @static - * @memberOf module:Utils - * @method - * @see [async.reflect]{@link module:Utils.reflect} - * @category Util - * @param {Array|Object|Iterable} tasks - The collection of - * [async functions]{@link AsyncFunction} to wrap in `async.reflect`. - * @returns {Array} Returns an array of async functions, each wrapped in - * `async.reflect` - * @example - * - * let tasks = [ - * function(callback) { - * setTimeout(function() { - * callback(null, 'one'); - * }, 200); - * }, - * function(callback) { - * // do some more stuff but error ... - * callback(new Error('bad stuff happened')); - * }, - * function(callback) { - * setTimeout(function() { - * callback(null, 'two'); - * }, 100); - * } - * ]; - * - * async.parallel(async.reflectAll(tasks), - * // optional callback - * function(err, results) { - * // values - * // results[0].value = 'one' - * // results[1].error = Error('bad stuff happened') - * // results[2].value = 'two' - * }); - * - * // an example using an object instead of an array - * let tasks = { - * one: function(callback) { - * setTimeout(function() { - * callback(null, 'one'); - * }, 200); - * }, - * two: function(callback) { - * callback('two'); - * }, - * three: function(callback) { - * setTimeout(function() { - * callback(null, 'three'); - * }, 100); - * } - * }; - * - * async.parallel(async.reflectAll(tasks), - * // optional callback - * function(err, results) { - * // values - * // results.one.value = 'one' - * // results.two.error = 'two' - * // results.three.value = 'three' - * }); - */ - - -function reflectAll(tasks) { - var _this2 = this; - - var results; - - if (Array.isArray(tasks)) { - results = tasks.map(reflect); - } else { - results = {}; - Object.keys(tasks).forEach(function (key) { - results[key] = reflect.call(_this2, tasks[key]); - }); - } - - return results; -} - -function reject(eachfn, arr, _iteratee, callback) { - var iteratee = wrapAsync(_iteratee); - return _filter(eachfn, arr, function (value, cb) { - iteratee(value, function (err, v) { - cb(err, !v); - }); - }, callback); -} -/** - * The opposite of [`filter`]{@link module:Collections.filter}. Removes values that pass an `async` truth test. - * - * @name reject - * @static - * @memberOf module:Collections - * @method - * @see [async.filter]{@link module:Collections.filter} - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {Function} iteratee - An async truth test to apply to each item in - * `coll`. - * The should complete with a boolean value as its `result`. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Invoked with (err, results). - * @returns {Promise} a promise, if no callback is passed - * @example - * - * async.reject(['file1','file2','file3'], function(filePath, callback) { - * fs.access(filePath, function(err) { - * callback(null, !err) - * }); - * }, function(err, results) { - * // results now equals an array of missing files - * createFiles(results); - * }); - */ - - -function reject$1(coll, iteratee, callback) { - return reject(eachOf$1, coll, iteratee, callback); -} - -var reject$2 = awaitify(reject$1, 3); -/** - * The same as [`reject`]{@link module:Collections.reject} but runs a maximum of `limit` async operations at a - * time. - * - * @name rejectLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.reject]{@link module:Collections.reject} - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {Function} iteratee - An async truth test to apply to each item in - * `coll`. - * The should complete with a boolean value as its `result`. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Invoked with (err, results). - * @returns {Promise} a promise, if no callback is passed - */ - -exports.reject = reject$2; - -function rejectLimit(coll, limit, iteratee, callback) { - return reject(eachOfLimit(limit), coll, iteratee, callback); -} - -var rejectLimit$1 = awaitify(rejectLimit, 4); -/** - * The same as [`reject`]{@link module:Collections.reject} but runs only a single async operation at a time. - * - * @name rejectSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.reject]{@link module:Collections.reject} - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {Function} iteratee - An async truth test to apply to each item in - * `coll`. - * The should complete with a boolean value as its `result`. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Invoked with (err, results). - * @returns {Promise} a promise, if no callback is passed - */ - -exports.rejectLimit = rejectLimit$1; - -function rejectSeries(coll, iteratee, callback) { - return reject(eachOfSeries$1, coll, iteratee, callback); -} - -var rejectSeries$1 = awaitify(rejectSeries, 3); -exports.rejectSeries = rejectSeries$1; - -function constant$1(value) { - return function () { - return value; - }; -} -/** - * Attempts to get a successful response from `task` no more than `times` times - * before returning an error. If the task is successful, the `callback` will be - * passed the result of the successful task. If all attempts fail, the callback - * will be passed the error and result (if any) of the final attempt. - * - * @name retry - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @see [async.retryable]{@link module:ControlFlow.retryable} - * @param {Object|number} [opts = {times: 5, interval: 0}| 5] - Can be either an - * object with `times` and `interval` or a number. - * * `times` - The number of attempts to make before giving up. The default - * is `5`. - * * `interval` - The time to wait between retries, in milliseconds. The - * default is `0`. The interval may also be specified as a function of the - * retry count (see example). - * * `errorFilter` - An optional synchronous function that is invoked on - * erroneous result. If it returns `true` the retry attempts will continue; - * if the function returns `false` the retry flow is aborted with the current - * attempt's error and result being returned to the final callback. - * Invoked with (err). - * * If `opts` is a number, the number specifies the number of times to retry, - * with the default interval of `0`. - * @param {AsyncFunction} task - An async function to retry. - * Invoked with (callback). - * @param {Function} [callback] - An optional callback which is called when the - * task has succeeded, or after the final failed attempt. It receives the `err` - * and `result` arguments of the last attempt at completing the `task`. Invoked - * with (err, results). - * @returns {Promise} a promise if no callback provided - * - * @example - * - * // The `retry` function can be used as a stand-alone control flow by passing - * // a callback, as shown below: - * - * // try calling apiMethod 3 times - * async.retry(3, apiMethod, function(err, result) { - * // do something with the result - * }); - * - * // try calling apiMethod 3 times, waiting 200 ms between each retry - * async.retry({times: 3, interval: 200}, apiMethod, function(err, result) { - * // do something with the result - * }); - * - * // try calling apiMethod 10 times with exponential backoff - * // (i.e. intervals of 100, 200, 400, 800, 1600, ... milliseconds) - * async.retry({ - * times: 10, - * interval: function(retryCount) { - * return 50 * Math.pow(2, retryCount); - * } - * }, apiMethod, function(err, result) { - * // do something with the result - * }); - * - * // try calling apiMethod the default 5 times no delay between each retry - * async.retry(apiMethod, function(err, result) { - * // do something with the result - * }); - * - * // try calling apiMethod only when error condition satisfies, all other - * // errors will abort the retry control flow and return to final callback - * async.retry({ - * errorFilter: function(err) { - * return err.message === 'Temporary error'; // only retry on a specific error - * } - * }, apiMethod, function(err, result) { - * // do something with the result - * }); - * - * // to retry individual methods that are not as reliable within other - * // control flow functions, use the `retryable` wrapper: - * async.auto({ - * users: api.getUsers.bind(api), - * payments: async.retryable(3, api.getPayments.bind(api)) - * }, function(err, results) { - * // do something with the results - * }); - * - */ - - -var DEFAULT_TIMES = 5; -var DEFAULT_INTERVAL = 0; - -function retry(opts, task, callback) { - var options = { - times: DEFAULT_TIMES, - intervalFunc: constant$1(DEFAULT_INTERVAL) - }; - - if (arguments.length < 3 && typeof opts === 'function') { - callback = task || promiseCallback(); - task = opts; - } else { - parseTimes(options, opts); - callback = callback || promiseCallback(); - } - - if (typeof task !== 'function') { - throw new Error("Invalid arguments for async.retry"); - } - - var _task = wrapAsync(task); - - var attempt = 1; - - function retryAttempt() { - _task(function (err) { - if (err === false) return; - - if (err && attempt++ < options.times && (typeof options.errorFilter != 'function' || options.errorFilter(err))) { - setTimeout(retryAttempt, options.intervalFunc(attempt - 1)); - } else { - for (var _len32 = arguments.length, args = new Array(_len32 > 1 ? _len32 - 1 : 0), _key32 = 1; _key32 < _len32; _key32++) { - args[_key32 - 1] = arguments[_key32]; - } - - callback.apply(void 0, [err].concat(args)); - } - }); - } - - retryAttempt(); - return callback[PROMISE_SYMBOL]; -} - -function parseTimes(acc, t) { - if (_typeof(t) === 'object') { - acc.times = +t.times || DEFAULT_TIMES; - acc.intervalFunc = typeof t.interval === 'function' ? t.interval : constant$1(+t.interval || DEFAULT_INTERVAL); - acc.errorFilter = t.errorFilter; - } else if (typeof t === 'number' || typeof t === 'string') { - acc.times = +t || DEFAULT_TIMES; - } else { - throw new Error("Invalid arguments for async.retry"); - } -} -/** - * A close relative of [`retry`]{@link module:ControlFlow.retry}. This method - * wraps a task and makes it retryable, rather than immediately calling it - * with retries. - * - * @name retryable - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.retry]{@link module:ControlFlow.retry} - * @category Control Flow - * @param {Object|number} [opts = {times: 5, interval: 0}| 5] - optional - * options, exactly the same as from `retry`, except for a `opts.arity` that - * is the arity of the `task` function, defaulting to `task.length` - * @param {AsyncFunction} task - the asynchronous function to wrap. - * This function will be passed any arguments passed to the returned wrapper. - * Invoked with (...args, callback). - * @returns {AsyncFunction} The wrapped function, which when invoked, will - * retry on an error, based on the parameters specified in `opts`. - * This function will accept the same parameters as `task`. - * @example - * - * async.auto({ - * dep1: async.retryable(3, getFromFlakyService), - * process: ["dep1", async.retryable(3, function (results, cb) { - * maybeProcessData(results.dep1, cb); - * })] - * }, callback); - */ - - -function retryable(opts, task) { - if (!task) { - task = opts; - opts = null; - } - - var arity = opts && opts.arity || task.length; - - if (isAsync(task)) { - arity += 1; - } - - var _task = wrapAsync(task); - - return initialParams(function (args, callback) { - if (args.length < arity - 1 || callback == null) { - args.push(callback); - callback = promiseCallback(); - } - - function taskFn(cb) { - _task.apply(void 0, _toConsumableArray(args).concat([cb])); - } - - if (opts) retry(opts, taskFn, callback);else retry(taskFn, callback); - return callback[PROMISE_SYMBOL]; - }); -} -/** - * Run the functions in the `tasks` collection in series, each one running once - * the previous function has completed. If any functions in the series pass an - * error to its callback, no more functions are run, and `callback` is - * immediately called with the value of the error. Otherwise, `callback` - * receives an array of results when `tasks` have completed. - * - * It is also possible to use an object instead of an array. Each property will - * be run as a function, and the results will be passed to the final `callback` - * as an object instead of an array. This can be a more readable way of handling - * results from {@link async.series}. - * - * **Note** that while many implementations preserve the order of object - * properties, the [ECMAScript Language Specification](http://www.ecma-international.org/ecma-262/5.1/#sec-8.6) - * explicitly states that - * - * > The mechanics and order of enumerating the properties is not specified. - * - * So if you rely on the order in which your series of functions are executed, - * and want this to work on all platforms, consider using an array. - * - * @name series - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection containing - * [async functions]{@link AsyncFunction} to run in series. - * Each function can complete with any number of optional `result` values. - * @param {Function} [callback] - An optional callback to run once all the - * functions have completed. This function gets a results array (or object) - * containing all the result arguments passed to the `task` callbacks. Invoked - * with (err, result). - * @return {Promise} a promise, if no callback is passed - * @example - * async.series([ - * function(callback) { - * // do some stuff ... - * callback(null, 'one'); - * }, - * function(callback) { - * // do some more stuff ... - * callback(null, 'two'); - * } - * ], - * // optional callback - * function(err, results) { - * // results is now equal to ['one', 'two'] - * }); - * - * async.series({ - * one: function(callback) { - * setTimeout(function() { - * callback(null, 1); - * }, 200); - * }, - * two: function(callback){ - * setTimeout(function() { - * callback(null, 2); - * }, 100); - * } - * }, function(err, results) { - * // results is now equal to: {one: 1, two: 2} - * }); - */ - - -function series(tasks, callback) { - return _parallel(eachOfSeries$1, tasks, callback); -} -/** - * Returns `true` if at least one element in the `coll` satisfies an async test. - * If any iteratee call returns `true`, the main `callback` is immediately - * called. - * - * @name some - * @static - * @memberOf module:Collections - * @method - * @alias any - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async truth test to apply to each item - * in the collections in parallel. - * The iteratee should complete with a boolean `result` value. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called as soon as any - * iteratee returns `true`, or after all the iteratee functions have finished. - * Result will be either `true` or `false` depending on the values of the async - * tests. Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - * @example - * - * async.some(['file1','file2','file3'], function(filePath, callback) { - * fs.access(filePath, function(err) { - * callback(null, !err) - * }); - * }, function(err, result) { - * // if result is true then at least one of the files exists - * }); - */ - - -function some(coll, iteratee, callback) { - return _createTester(Boolean, function (res) { - return res; - })(eachOf$1, coll, iteratee, callback); -} - -var some$1 = awaitify(some, 3); -/** - * The same as [`some`]{@link module:Collections.some} but runs a maximum of `limit` async operations at a time. - * - * @name someLimit - * @static - * @memberOf module:Collections - * @method - * @see [async.some]{@link module:Collections.some} - * @alias anyLimit - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - An async truth test to apply to each item - * in the collections in parallel. - * The iteratee should complete with a boolean `result` value. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called as soon as any - * iteratee returns `true`, or after all the iteratee functions have finished. - * Result will be either `true` or `false` depending on the values of the async - * tests. Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - */ - -exports.any = exports.some = some$1; - -function someLimit(coll, limit, iteratee, callback) { - return _createTester(Boolean, function (res) { - return res; - })(eachOfLimit(limit), coll, iteratee, callback); -} - -var someLimit$1 = awaitify(someLimit, 4); -/** - * The same as [`some`]{@link module:Collections.some} but runs only a single async operation at a time. - * - * @name someSeries - * @static - * @memberOf module:Collections - * @method - * @see [async.some]{@link module:Collections.some} - * @alias anySeries - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async truth test to apply to each item - * in the collections in series. - * The iteratee should complete with a boolean `result` value. - * Invoked with (item, callback). - * @param {Function} [callback] - A callback which is called as soon as any - * iteratee returns `true`, or after all the iteratee functions have finished. - * Result will be either `true` or `false` depending on the values of the async - * tests. Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - */ - -exports.anyLimit = exports.someLimit = someLimit$1; - -function someSeries(coll, iteratee, callback) { - return _createTester(Boolean, function (res) { - return res; - })(eachOfSeries$1, coll, iteratee, callback); -} - -var someSeries$1 = awaitify(someSeries, 3); -/** - * Sorts a list by the results of running each `coll` value through an async - * `iteratee`. - * - * @name sortBy - * @static - * @memberOf module:Collections - * @method - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {AsyncFunction} iteratee - An async function to apply to each item in - * `coll`. - * The iteratee should complete with a value to use as the sort criteria as - * its `result`. - * Invoked with (item, callback). - * @param {Function} callback - A callback which is called after all the - * `iteratee` functions have finished, or an error occurs. Results is the items - * from the original `coll` sorted by the values returned by the `iteratee` - * calls. Invoked with (err, results). - * @returns {Promise} a promise, if no callback passed - * @example - * - * async.sortBy(['file1','file2','file3'], function(file, callback) { - * fs.stat(file, function(err, stats) { - * callback(err, stats.mtime); - * }); - * }, function(err, results) { - * // results is now the original array of files sorted by - * // modified date - * }); - * - * // By modifying the callback parameter the - * // sorting order can be influenced: - * - * // ascending order - * async.sortBy([1,9,3,5], function(x, callback) { - * callback(null, x); - * }, function(err,result) { - * // result callback - * }); - * - * // descending order - * async.sortBy([1,9,3,5], function(x, callback) { - * callback(null, x*-1); //<- x*-1 instead of x, turns the order around - * }, function(err,result) { - * // result callback - * }); - */ - -exports.anySeries = exports.someSeries = someSeries$1; - -function sortBy(coll, iteratee, callback) { - var _iteratee = wrapAsync(iteratee); - - return map$1(coll, function (x, iterCb) { - _iteratee(x, function (err, criteria) { - if (err) return iterCb(err); - iterCb(err, { - value: x, - criteria: criteria - }); - }); - }, function (err, results) { - if (err) return callback(err); - callback(null, results.sort(comparator).map(function (v) { - return v.value; - })); - }); - - function comparator(left, right) { - var a = left.criteria, - b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - } -} - -var sortBy$1 = awaitify(sortBy, 3); -/** - * Sets a time limit on an asynchronous function. If the function does not call - * its callback within the specified milliseconds, it will be called with a - * timeout error. The code property for the error object will be `'ETIMEDOUT'`. - * - * @name timeout - * @static - * @memberOf module:Utils - * @method - * @category Util - * @param {AsyncFunction} asyncFn - The async function to limit in time. - * @param {number} milliseconds - The specified time limit. - * @param {*} [info] - Any variable you want attached (`string`, `object`, etc) - * to timeout Error for more information.. - * @returns {AsyncFunction} Returns a wrapped function that can be used with any - * of the control flow functions. - * Invoke this function with the same parameters as you would `asyncFunc`. - * @example - * - * function myFunction(foo, callback) { - * doAsyncTask(foo, function(err, data) { - * // handle errors - * if (err) return callback(err); - * - * // do some stuff ... - * - * // return processed data - * return callback(null, data); - * }); - * } - * - * var wrapped = async.timeout(myFunction, 1000); - * - * // call `wrapped` as you would `myFunction` - * wrapped({ bar: 'bar' }, function(err, data) { - * // if `myFunction` takes < 1000 ms to execute, `err` - * // and `data` will have their expected values - * - * // else `err` will be an Error with the code 'ETIMEDOUT' - * }); - */ - -exports.sortBy = sortBy$1; - -function timeout(asyncFn, milliseconds, info) { - var fn = wrapAsync(asyncFn); - return initialParams(function (args, callback) { - var timedOut = false; - var timer; - - function timeoutCallback() { - var name = asyncFn.name || 'anonymous'; - var error = new Error('Callback function "' + name + '" timed out.'); - error.code = 'ETIMEDOUT'; - - if (info) { - error.info = info; - } - - timedOut = true; - callback(error); - } - - args.push(function () { - if (!timedOut) { - callback.apply(void 0, arguments); - clearTimeout(timer); - } - }); // setup timer and call original function - - timer = setTimeout(timeoutCallback, milliseconds); - fn.apply(void 0, _toConsumableArray(args)); - }); -} - -function range(size) { - var result = Array(size); - - while (size--) { - result[size] = size; - } - - return result; -} -/** - * The same as [times]{@link module:ControlFlow.times} but runs a maximum of `limit` async operations at a - * time. - * - * @name timesLimit - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.times]{@link module:ControlFlow.times} - * @category Control Flow - * @param {number} count - The number of times to run the function. - * @param {number} limit - The maximum number of async operations at a time. - * @param {AsyncFunction} iteratee - The async function to call `n` times. - * Invoked with the iteration index and a callback: (n, next). - * @param {Function} callback - see [async.map]{@link module:Collections.map}. - * @returns {Promise} a promise, if no callback is provided - */ - - -function timesLimit(count, limit, iteratee, callback) { - var _iteratee = wrapAsync(iteratee); - - return mapLimit$1(range(count), limit, _iteratee, callback); -} -/** - * Calls the `iteratee` function `n` times, and accumulates results in the same - * manner you would use with [map]{@link module:Collections.map}. - * - * @name times - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.map]{@link module:Collections.map} - * @category Control Flow - * @param {number} n - The number of times to run the function. - * @param {AsyncFunction} iteratee - The async function to call `n` times. - * Invoked with the iteration index and a callback: (n, next). - * @param {Function} callback - see {@link module:Collections.map}. - * @returns {Promise} a promise, if no callback is provided - * @example - * - * // Pretend this is some complicated async factory - * var createUser = function(id, callback) { - * callback(null, { - * id: 'user' + id - * }); - * }; - * - * // generate 5 users - * async.times(5, function(n, next) { - * createUser(n, function(err, user) { - * next(err, user); - * }); - * }, function(err, users) { - * // we should now have 5 users - * }); - */ - - -function times(n, iteratee, callback) { - return timesLimit(n, Infinity, iteratee, callback); -} -/** - * The same as [times]{@link module:ControlFlow.times} but runs only a single async operation at a time. - * - * @name timesSeries - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.times]{@link module:ControlFlow.times} - * @category Control Flow - * @param {number} n - The number of times to run the function. - * @param {AsyncFunction} iteratee - The async function to call `n` times. - * Invoked with the iteration index and a callback: (n, next). - * @param {Function} callback - see {@link module:Collections.map}. - * @returns {Promise} a promise, if no callback is provided - */ - - -function timesSeries(n, iteratee, callback) { - return timesLimit(n, 1, iteratee, callback); -} -/** - * A relative of `reduce`. Takes an Object or Array, and iterates over each - * element in parallel, each step potentially mutating an `accumulator` value. - * The type of the accumulator defaults to the type of collection passed in. - * - * @name transform - * @static - * @memberOf module:Collections - * @method - * @category Collection - * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over. - * @param {*} [accumulator] - The initial state of the transform. If omitted, - * it will default to an empty Object or Array, depending on the type of `coll` - * @param {AsyncFunction} iteratee - A function applied to each item in the - * collection that potentially modifies the accumulator. - * Invoked with (accumulator, item, key, callback). - * @param {Function} [callback] - A callback which is called after all the - * `iteratee` functions have finished. Result is the transformed accumulator. - * Invoked with (err, result). - * @returns {Promise} a promise, if no callback provided - * @example - * - * async.transform([1,2,3], function(acc, item, index, callback) { - * // pointless async: - * process.nextTick(function() { - * acc[index] = item * 2 - * callback(null) - * }); - * }, function(err, result) { - * // result is now equal to [2, 4, 6] - * }); - * - * @example - * - * async.transform({a: 1, b: 2, c: 3}, function (obj, val, key, callback) { - * setImmediate(function () { - * obj[key] = val * 2; - * callback(); - * }) - * }, function (err, result) { - * // result is equal to {a: 2, b: 4, c: 6} - * }) - */ - - -function transform(coll, accumulator, iteratee, callback) { - if (arguments.length <= 3 && typeof accumulator === 'function') { - callback = iteratee; - iteratee = accumulator; - accumulator = Array.isArray(coll) ? [] : {}; - } - - callback = once(callback || promiseCallback()); - - var _iteratee = wrapAsync(iteratee); - - eachOf$1(coll, function (v, k, cb) { - _iteratee(accumulator, v, k, cb); - }, function (err) { - return callback(err, accumulator); - }); - return callback[PROMISE_SYMBOL]; -} -/** - * It runs each task in series but stops whenever any of the functions were - * successful. If one of the tasks were successful, the `callback` will be - * passed the result of the successful task. If all tasks fail, the callback - * will be passed the error and result (if any) of the final attempt. - * - * @name tryEach - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {Array|Iterable|AsyncIterable|Object} tasks - A collection containing functions to - * run, each function is passed a `callback(err, result)` it must call on - * completion with an error `err` (which can be `null`) and an optional `result` - * value. - * @param {Function} [callback] - An optional callback which is called when one - * of the tasks has succeeded, or all have failed. It receives the `err` and - * `result` arguments of the last attempt at completing the `task`. Invoked with - * (err, results). - * @returns {Promise} a promise, if no callback is passed - * @example - * async.tryEach([ - * function getDataFromFirstWebsite(callback) { - * // Try getting the data from the first website - * callback(err, data); - * }, - * function getDataFromSecondWebsite(callback) { - * // First website failed, - * // Try getting the data from the backup website - * callback(err, data); - * } - * ], - * // optional callback - * function(err, results) { - * Now do something with the data. - * }); - * - */ - - -function tryEach(tasks, callback) { - var error = null; - var result; - return eachSeries$1(tasks, function (task, taskCb) { - wrapAsync(task)(function (err) { - if (err === false) return taskCb(err); - - for (var _len33 = arguments.length, args = new Array(_len33 > 1 ? _len33 - 1 : 0), _key33 = 1; _key33 < _len33; _key33++) { - args[_key33 - 1] = arguments[_key33]; - } - - if (args.length < 2) { - result = args[0]; - } else { - result = args; - } - - error = err; - taskCb(err ? null : {}); - }); - }, function () { - return callback(error, result); - }); -} - -var tryEach$1 = awaitify(tryEach); -/** - * Undoes a [memoize]{@link module:Utils.memoize}d function, reverting it to the original, - * unmemoized form. Handy for testing. - * - * @name unmemoize - * @static - * @memberOf module:Utils - * @method - * @see [async.memoize]{@link module:Utils.memoize} - * @category Util - * @param {AsyncFunction} fn - the memoized function - * @returns {AsyncFunction} a function that calls the original unmemoized function - */ - -exports.tryEach = tryEach$1; - -function unmemoize(fn) { - return function () { - return (fn.unmemoized || fn).apply(void 0, arguments); - }; -} -/** - * Repeatedly call `iteratee`, while `test` returns `true`. Calls `callback` when - * stopped, or an error occurs. - * - * @name whilst - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {AsyncFunction} test - asynchronous truth test to perform before each - * execution of `iteratee`. Invoked with (). - * @param {AsyncFunction} iteratee - An async function which is called each time - * `test` passes. Invoked with (callback). - * @param {Function} [callback] - A callback which is called after the test - * function has failed and repeated execution of `iteratee` has stopped. `callback` - * will be passed an error and any arguments passed to the final `iteratee`'s - * callback. Invoked with (err, [results]); - * @returns {Promise} a promise, if no callback is passed - * @example - * - * var count = 0; - * async.whilst( - * function test(cb) { cb(null, count < 5;) }, - * function iter(callback) { - * count++; - * setTimeout(function() { - * callback(null, count); - * }, 1000); - * }, - * function (err, n) { - * // 5 seconds have passed, n = 5 - * } - * ); - */ - - -function whilst(test, iteratee, callback) { - callback = onlyOnce(callback); - - var _fn = wrapAsync(iteratee); - - var _test = wrapAsync(test); - - var results = []; - - function next(err) { - if (err) return callback(err); - - for (var _len34 = arguments.length, rest = new Array(_len34 > 1 ? _len34 - 1 : 0), _key34 = 1; _key34 < _len34; _key34++) { - rest[_key34 - 1] = arguments[_key34]; - } - - results = rest; - if (err === false) return; - - _test(check); - } - - function check(err, truth) { - if (err) return callback(err); - if (err === false) return; - if (!truth) return callback.apply(void 0, [null].concat(_toConsumableArray(results))); - - _fn(next); - } - - return _test(check); -} - -var whilst$1 = awaitify(whilst, 3); -/** - * Repeatedly call `iteratee` until `test` returns `true`. Calls `callback` when - * stopped, or an error occurs. `callback` will be passed an error and any - * arguments passed to the final `iteratee`'s callback. - * - * The inverse of [whilst]{@link module:ControlFlow.whilst}. - * - * @name until - * @static - * @memberOf module:ControlFlow - * @method - * @see [async.whilst]{@link module:ControlFlow.whilst} - * @category Control Flow - * @param {AsyncFunction} test - asynchronous truth test to perform before each - * execution of `iteratee`. Invoked with (callback). - * @param {AsyncFunction} iteratee - An async function which is called each time - * `test` fails. Invoked with (callback). - * @param {Function} [callback] - A callback which is called after the test - * function has passed and repeated execution of `iteratee` has stopped. `callback` - * will be passed an error and any arguments passed to the final `iteratee`'s - * callback. Invoked with (err, [results]); - * @returns {Promise} a promise, if a callback is not passed - * - * @example - * const results = [] - * async.until(function test(page, cb) { - * cb(null, page.next == null) - * }, function iter(next) { - * fetchPage(url, (err, body) => { - * if (err) return next(err) - * results = results.concat(body.objects) - * next(err, body) - * }) - * }, function done (err) { - * // all pages have been fetched - * }) - */ - -exports.during = exports.whilst = whilst$1; - -function until(test, iteratee, callback) { - var _test = wrapAsync(test); - - return whilst$1(function (cb) { - return _test(function (err, truth) { - return cb(err, !truth); - }); - }, iteratee, callback); -} -/** - * Runs the `tasks` array of functions in series, each passing their results to - * the next in the array. However, if any of the `tasks` pass an error to their - * own callback, the next function is not executed, and the main `callback` is - * immediately called with the error. - * - * @name waterfall - * @static - * @memberOf module:ControlFlow - * @method - * @category Control Flow - * @param {Array} tasks - An array of [async functions]{@link AsyncFunction} - * to run. - * Each function should complete with any number of `result` values. - * The `result` values will be passed as arguments, in order, to the next task. - * @param {Function} [callback] - An optional callback to run once all the - * functions have completed. This will be passed the results of the last task's - * callback. Invoked with (err, [results]). - * @returns undefined - * @example - * - * async.waterfall([ - * function(callback) { - * callback(null, 'one', 'two'); - * }, - * function(arg1, arg2, callback) { - * // arg1 now equals 'one' and arg2 now equals 'two' - * callback(null, 'three'); - * }, - * function(arg1, callback) { - * // arg1 now equals 'three' - * callback(null, 'done'); - * } - * ], function (err, result) { - * // result now equals 'done' - * }); - * - * // Or, with named functions: - * async.waterfall([ - * myFirstFunction, - * mySecondFunction, - * myLastFunction, - * ], function (err, result) { - * // result now equals 'done' - * }); - * function myFirstFunction(callback) { - * callback(null, 'one', 'two'); - * } - * function mySecondFunction(arg1, arg2, callback) { - * // arg1 now equals 'one' and arg2 now equals 'two' - * callback(null, 'three'); - * } - * function myLastFunction(arg1, callback) { - * // arg1 now equals 'three' - * callback(null, 'done'); - * } - */ - - -function waterfall(tasks, callback) { - callback = once(callback); - if (!Array.isArray(tasks)) return callback(new Error('First argument to waterfall must be an array of functions')); - if (!tasks.length) return callback(); - var taskIndex = 0; - - function nextTask(args) { - var task = wrapAsync(tasks[taskIndex++]); - task.apply(void 0, _toConsumableArray(args).concat([onlyOnce(next)])); - } - - function next(err) { - if (err === false) return; - - for (var _len35 = arguments.length, args = new Array(_len35 > 1 ? _len35 - 1 : 0), _key35 = 1; _key35 < _len35; _key35++) { - args[_key35 - 1] = arguments[_key35]; - } - - if (err || taskIndex === tasks.length) { - return callback.apply(void 0, [err].concat(args)); - } - - nextTask(args); - } - - nextTask([]); -} - -var waterfall$1 = awaitify(waterfall); -/** - * An "async function" in the context of Async is an asynchronous function with - * a variable number of parameters, with the final parameter being a callback. - * (`function (arg1, arg2, ..., callback) {}`) - * The final callback is of the form `callback(err, results...)`, which must be - * called once the function is completed. The callback should be called with a - * Error as its first argument to signal that an error occurred. - * Otherwise, if no error occurred, it should be called with `null` as the first - * argument, and any additional `result` arguments that may apply, to signal - * successful completion. - * The callback must be called exactly once, ideally on a later tick of the - * JavaScript event loop. - * - * This type of function is also referred to as a "Node-style async function", - * or a "continuation passing-style function" (CPS). Most of the methods of this - * library are themselves CPS/Node-style async functions, or functions that - * return CPS/Node-style async functions. - * - * Wherever we accept a Node-style async function, we also directly accept an - * [ES2017 `async` function]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function}. - * In this case, the `async` function will not be passed a final callback - * argument, and any thrown error will be used as the `err` argument of the - * implicit callback, and the return value will be used as the `result` value. - * (i.e. a `rejected` of the returned Promise becomes the `err` callback - * argument, and a `resolved` value becomes the `result`.) - * - * Note, due to JavaScript limitations, we can only detect native `async` - * functions and not transpilied implementations. - * Your environment must have `async`/`await` support for this to work. - * (e.g. Node > v7.6, or a recent version of a modern browser). - * If you are using `async` functions through a transpiler (e.g. Babel), you - * must still wrap the function with [asyncify]{@link module:Utils.asyncify}, - * because the `async function` will be compiled to an ordinary function that - * returns a promise. - * - * @typedef {Function} AsyncFunction - * @static - */ - -exports.waterfall = waterfall$1; -var index = { - apply: apply, - applyEach: applyEach$1, - applyEachSeries: applyEachSeries, - asyncify: asyncify, - auto: auto, - autoInject: autoInject, - cargo: cargo, - cargoQueue: cargo$1, - compose: compose, - concat: concat$1, - concatLimit: concatLimit$1, - concatSeries: concatSeries$1, - constant: constant, - detect: detect$1, - detectLimit: detectLimit$1, - detectSeries: detectSeries$1, - dir: dir, - doUntil: doUntil, - doWhilst: doWhilst$1, - each: each, - eachLimit: eachLimit$2, - eachOf: eachOf$1, - eachOfLimit: eachOfLimit$2, - eachOfSeries: eachOfSeries$1, - eachSeries: eachSeries$1, - ensureAsync: ensureAsync, - every: every$1, - everyLimit: everyLimit$1, - everySeries: everySeries$1, - filter: filter$1, - filterLimit: filterLimit$1, - filterSeries: filterSeries$1, - forever: forever$1, - groupBy: groupBy, - groupByLimit: groupByLimit$1, - groupBySeries: groupBySeries, - log: log, - map: map$1, - mapLimit: mapLimit$1, - mapSeries: mapSeries$1, - mapValues: mapValues, - mapValuesLimit: mapValuesLimit$1, - mapValuesSeries: mapValuesSeries, - memoize: memoize, - nextTick: nextTick, - parallel: parallel, - parallelLimit: parallelLimit, - priorityQueue: priorityQueue, - queue: queue$1, - race: race$1, - reduce: reduce$1, - reduceRight: reduceRight, - reflect: reflect, - reflectAll: reflectAll, - reject: reject$2, - rejectLimit: rejectLimit$1, - rejectSeries: rejectSeries$1, - retry: retry, - retryable: retryable, - seq: seq, - series: series, - setImmediate: setImmediate$1, - some: some$1, - someLimit: someLimit$1, - someSeries: someSeries$1, - sortBy: sortBy$1, - timeout: timeout, - times: times, - timesLimit: timesLimit, - timesSeries: timesSeries, - transform: transform, - tryEach: tryEach$1, - unmemoize: unmemoize, - until: until, - waterfall: waterfall$1, - whilst: whilst$1, - // aliases - all: every$1, - allLimit: everyLimit$1, - allSeries: everySeries$1, - any: some$1, - anyLimit: someLimit$1, - anySeries: someSeries$1, - find: detect$1, - findLimit: detectLimit$1, - findSeries: detectSeries$1, - flatMap: concat$1, - flatMapLimit: concatLimit$1, - flatMapSeries: concatSeries$1, - forEach: each, - forEachSeries: eachSeries$1, - forEachLimit: eachLimit$2, - forEachOf: eachOf$1, - forEachOfSeries: eachOfSeries$1, - forEachOfLimit: eachOfLimit$2, - inject: reduce$1, - foldl: reduce$1, - foldr: reduceRight, - select: filter$1, - selectLimit: filterLimit$1, - selectSeries: filterSeries$1, - wrapSync: asyncify, - during: whilst$1, - doDuring: doWhilst$1 -}; -var _default = index; -exports.default = _default; -},{"process":"pBGv"}],"IEzs":[function(require,module,exports) { -/* - * This module is intended to be executed both on client side and server side. - * No error should be thrown. (soft error handling) - */ - -(function () { - var root = {}; - // Dependencies -------------------------------------------------------------- - root.async = (typeof require === 'function') ? require('async') : window.async; - if (typeof root.async !== 'object') { - throw new Error('Module async is required (https://github.com/caolan/async)'); - } - var async = root.async; - - function _extend(origin, add) { - if (!add || typeof add !== 'object') { - return origin; - } - var keys = Object.keys(add); - var i = keys.length; - while (i--) { - origin[keys[i]] = add[keys[i]]; - } - return origin; - } - - function _merge() { - var ret = {}; - var args = Array.prototype.slice.call(arguments); - var keys = null; - var i = null; - - args.forEach(function (arg) { - if (arg && arg.constructor === Object) { - keys = Object.keys(arg); - i = keys.length; - while (i--) { - ret[keys[i]] = arg[keys[i]]; - } - } - }); - return ret; - } - - // Customisable class (Base class) ------------------------------------------- - // Use with operation "new" to extend Validation and Sanitization themselves, - // not their prototype. In other words, constructor shall be call to extend - // those functions, instead of being in their constructor, like this: - // _extend(Validation, new Customisable); - - function Customisable() { - this.custom = {}; - - this.extend = function (custom) { - return _extend(this.custom, custom); - }; - - this.reset = function () { - this.custom = {}; - }; - - this.remove = function (fields) { - if (!_typeIs.array(fields)) { - fields = [fields]; - } - fields.forEach(function (field) { - delete this.custom[field]; - }, this); - }; - } - - // Inspection class (Base class) --------------------------------------------- - // Use to extend Validation and Sanitization prototypes. Inspection - // constructor shall be called in derived class constructor. - - function Inspection(schema, custom) { - var _stack = ['@']; - - this._schema = schema; - this._custom = {}; - if (custom != null) { - for (var key in custom) { - if (Object.prototype.hasOwnProperty.call(custom, key)) { - this._custom['$' + key] = custom[key]; - } - } - } - - this._getDepth = function () { - return _stack.length; - }; - - this._dumpStack = function () { - return _stack.map(function (i) {return i.replace(/^\[/g, '\u001b\u001c\u001d\u001e');}) - .join('.').replace(/\.\u001b\u001c\u001d\u001e/g, '['); - }; - - this._deeperObject = function (name) { - _stack.push((/^[a-z$_][a-z0-9$_]*$/i).test(name) ? name : '["' + name + '"]'); - return this; - }; - - this._deeperArray = function (i) { - _stack.push('[' + i + ']'); - return this; - }; - - this._back = function () { - _stack.pop(); - return this; - }; - } - // Simple types -------------------------------------------------------------- - // If the property is not defined or is not in this list: - var _typeIs = { - "function": function (element) { - return typeof element === 'function'; - }, - "string": function (element) { - return typeof element === 'string'; - }, - "number": function (element) { - return typeof element === 'number' && !isNaN(element); - }, - "integer": function (element) { - return typeof element === 'number' && element % 1 === 0; - }, - "NaN": function (element) { - return typeof element === 'number' && isNaN(element); - }, - "boolean": function (element) { - return typeof element === 'boolean'; - }, - "null": function (element) { - return element === null; - }, - "date": function (element) { - return element != null && element instanceof Date; - }, - "object": function (element) { - return element != null && element.constructor === Object; - }, - "array": function (element) { - return element != null && element.constructor === Array; - }, - "any": function (element) { - return true; - } - }; - - function _simpleType(type, candidate) { - if (typeof type == 'function') { - return candidate instanceof type; - } - type = type in _typeIs ? type : 'any'; - return _typeIs[type](candidate); - } - - function _realType(candidate) { - for (var i in _typeIs) { - if (_simpleType(i, candidate)) { - if (i !== 'any') { return i; } - return 'an instance of ' + candidate.constructor.name; - } - } - } - - function getIndexes(a, value) { - var indexes = []; - var i = a.indexOf(value); - - while (i !== -1) { - indexes.push(i); - i = a.indexOf(value, i + 1); - } - return indexes; - } - - // Available formats --------------------------------------------------------- - var _formats = { - 'void': /^$/, - 'url': /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)?(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i, - 'date-time': /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{3})?(Z?|(-|\+)\d{2}:\d{2})$/, - 'date': /^\d{4}-\d{2}-\d{2}$/, - 'coolDateTime': /^\d{4}(-|\/)\d{2}(-|\/)\d{2}(T| )\d{2}:\d{2}:\d{2}(\.\d{3})?Z?$/, - 'time': /^\d{2}\:\d{2}\:\d{2}$/, - 'color': /^#([0-9a-f])+$/i, - 'email': /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i, - 'numeric': /^[0-9]+$/, - 'integer': /^\-?[0-9]+$/, - 'decimal': /^\-?[0-9]*\.?[0-9]+$/, - 'alpha': /^[a-z]+$/i, - 'alphaNumeric': /^[a-z0-9]+$/i, - 'alphaDash': /^[a-z0-9_-]+$/i, - 'javascript': /^[a-z_\$][a-z0-9_\$]*$/i, - 'upperString': /^[A-Z ]*$/, - 'lowerString': /^[a-z ]*$/ - }; - -// Validation ------------------------------------------------------------------ - var _validationAttribut = { - optional: function (schema, candidate) { - var opt = typeof schema.optional === 'boolean' ? schema.optional : (schema.optional === 'true'); // Default is false - - if (opt === true) { - return; - } - if (typeof candidate === 'undefined') { - this.report('is missing and not optional', null, 'optional'); - } - }, - type: function (schema, candidate) { - // return because optional function already handle this case - if (typeof candidate === 'undefined' || (typeof schema.type !== 'string' && !(schema.type instanceof Array) && typeof schema.type !== 'function')) { - return; - } - var types = _typeIs.array(schema.type) ? schema.type : [schema.type]; - var typeIsValid = types.some(function (type) { - return _simpleType(type, candidate); - }); - if (!typeIsValid) { - types = types.map(function (t) {return typeof t === 'function' ? 'and instance of ' + t.name : t; }); - this.report('must be ' + types.join(' or ') + ', but is ' + _realType(candidate), null, 'type'); - } - }, - uniqueness: function (schema, candidate) { - if (typeof schema.uniqueness === 'string') { schema.uniqueness = (schema.uniqueness === 'true'); } - if (typeof schema.uniqueness !== 'boolean' || schema.uniqueness === false || (!_typeIs.array(candidate) && typeof candidate !== 'string')) { - return; - } - var reported = []; - for (var i = 0; i < candidate.length; i++) { - if (reported.indexOf(candidate[i]) >= 0) { - continue; - } - var indexes = getIndexes(candidate, candidate[i]); - if (indexes.length > 1) { - reported.push(candidate[i]); - this.report('has value [' + candidate[i] + '] more than once at indexes [' + indexes.join(', ') + ']', null, 'uniqueness'); - } - } - }, - pattern: function (schema, candidate) { - var self = this; - var regexs = schema.pattern; - if (typeof candidate !== 'string') { - return; - } - var matches = false; - if (!_typeIs.array(regexs)) { - regexs = [regexs]; - } - regexs.forEach(function (regex) { - if (typeof regex === 'string' && regex in _formats) { - regex = _formats[regex]; - } - if (regex instanceof RegExp) { - if (regex.test(candidate)) { - matches = true; - } - } - }); - if (!matches) { - self.report('must match [' + regexs.join(' or ') + '], but is equal to "' + candidate + '"', null, 'pattern'); - } - }, - validDate: function (schema, candidate) { - if (String(schema.validDate) === 'true' && candidate instanceof Date && isNaN(candidate.getTime())) { - this.report('must be a valid date', null, 'validDate'); - } - }, - minLength: function (schema, candidate) { - if (typeof candidate !== 'string' && !_typeIs.array(candidate)) { - return; - } - var minLength = Number(schema.minLength); - if (isNaN(minLength)) { - return; - } - if (candidate.length < minLength) { - this.report('must be longer than ' + minLength + ' elements, but it has ' + candidate.length, null, 'minLength'); - } - }, - maxLength: function (schema, candidate) { - if (typeof candidate !== 'string' && !_typeIs.array(candidate)) { - return; - } - var maxLength = Number(schema.maxLength); - if (isNaN(maxLength)) { - return; - } - if (candidate.length > maxLength) { - this.report('must be shorter than ' + maxLength + ' elements, but it has ' + candidate.length, null, 'maxLength'); - } - }, - exactLength: function (schema, candidate) { - if (typeof candidate !== 'string' && !_typeIs.array(candidate)) { - return; - } - var exactLength = Number(schema.exactLength); - if (isNaN(exactLength)) { - return; - } - if (candidate.length !== exactLength) { - this.report('must have exactly ' + exactLength + ' elements, but it have ' + candidate.length, null, 'exactLength'); - } - }, - lt: function (schema, candidate) { - var limit = Number(schema.lt); - if (typeof candidate !== 'number' || isNaN(limit)) { - return; - } - if (candidate >= limit) { - this.report('must be less than ' + limit + ', but is equal to "' + candidate + '"', null, 'lt'); - } - }, - lte: function (schema, candidate) { - var limit = Number(schema.lte); - if (typeof candidate !== 'number' || isNaN(limit)) { - return; - } - if (candidate > limit) { - this.report('must be less than or equal to ' + limit + ', but is equal to "' + candidate + '"', null, 'lte'); - } - }, - gt: function (schema, candidate) { - var limit = Number(schema.gt); - if (typeof candidate !== 'number' || isNaN(limit)) { - return; - } - if (candidate <= limit) { - this.report('must be greater than ' + limit + ', but is equal to "' + candidate + '"', null, 'gt'); - } - }, - gte: function (schema, candidate) { - var limit = Number(schema.gte); - if (typeof candidate !== 'number' || isNaN(limit)) { - return; - } - if (candidate < limit) { - this.report('must be greater than or equal to ' + limit + ', but is equal to "' + candidate + '"', null, 'gte'); - } - }, - eq: function (schema, candidate) { - if (typeof candidate !== 'number' && typeof candidate !== 'string' && typeof candidate !== 'boolean') { - return; - } - var limit = schema.eq; - if (typeof limit !== 'number' && typeof limit !== 'string' && typeof limit !== 'boolean' && !_typeIs.array(limit)) { - return; - } - if (_typeIs.array(limit)) { - for (var i = 0; i < limit.length; i++) { - if (candidate === limit[i]) { - return; - } - } - this.report('must be equal to [' + limit.map(function (l) { - return '"' + l + '"'; - }).join(' or ') + '], but is equal to "' + candidate + '"', null, 'eq'); - } - else { - if (candidate !== limit) { - this.report('must be equal to "' + limit + '", but is equal to "' + candidate + '"', null, 'eq'); - } - } - }, - ne: function (schema, candidate) { - if (typeof candidate !== 'number' && typeof candidate !== 'string') { - return; - } - var limit = schema.ne; - if (typeof limit !== 'number' && typeof limit !== 'string' && !_typeIs.array(limit)) { - return; - } - if (_typeIs.array(limit)) { - for (var i = 0; i < limit.length; i++) { - if (candidate === limit[i]) { - this.report('must not be equal to "' + limit[i] + '"', null, 'ne'); - return; - } - } - } - else { - if (candidate === limit) { - this.report('must not be equal to "' + limit + '"', null, 'ne'); - } - } - }, - someKeys: function (schema, candidat) { - var _keys = schema.someKeys; - if (!_typeIs.object(candidat)) { - return; - } - var valid = _keys.some(function (action) { - return (action in candidat); - }); - if (!valid) { - this.report('must have at least key ' + _keys.map(function (i) { - return '"' + i + '"'; - }).join(' or '), null, 'someKeys'); - } - }, - strict: function (schema, candidate) { - if (typeof schema.strict === 'string') { schema.strict = (schema.strict === 'true'); } - if (schema.strict !== true || !_typeIs.object(candidate) || !_typeIs.object(schema.properties)) { - return; - } - var self = this; - if (typeof schema.properties['*'] === 'undefined') { - var intruder = Object.keys(candidate).filter(function (key) { - return (typeof schema.properties[key] === 'undefined'); - }); - if (intruder.length > 0) { - var msg = 'should not contains ' + (intruder.length > 1 ? 'properties' : 'property') + - ' [' + intruder.map(function (i) { return '"' + i + '"'; }).join(', ') + ']'; - self.report(msg, null, 'strict'); - } - } - }, - exec: function (schema, candidate, callback) { - var self = this; - - if (typeof callback === 'function') { - return this.asyncExec(schema, candidate, callback); - } - (_typeIs.array(schema.exec) ? schema.exec : [schema.exec]).forEach(function (exec) { - if (typeof exec === 'function') { - exec.call(self, schema, candidate); - } - }); - }, - properties: function (schema, candidate, callback) { - if (typeof callback === 'function') { - return this.asyncProperties(schema, candidate, callback); - } - if (!(schema.properties instanceof Object) || !(candidate instanceof Object)) { - return; - } - var properties = schema.properties, - i; - if (properties['*'] != null) { - for (i in candidate) { - if (i in properties) { - continue; - } - this._deeperObject(i); - this._validate(properties['*'], candidate[i]); - this._back(); - } - } - for (i in properties) { - if (i === '*') { - continue; - } - this._deeperObject(i); - this._validate(properties[i], candidate[i]); - this._back(); - } - }, - items: function (schema, candidate, callback) { - if (typeof callback === 'function') { - return this.asyncItems(schema, candidate, callback); - } - if (!(schema.items instanceof Object) || !(candidate instanceof Object)) { - return; - } - var items = schema.items; - var i, l; - // If provided schema is an array - // then call validate for each case - // else it is an Object - // then call validate for each key - if (_typeIs.array(items) && _typeIs.array(candidate)) { - for (i = 0, l = items.length; i < l; i++) { - this._deeperArray(i); - this._validate(items[i], candidate[i]); - this._back(); - } - } - else { - for (var key in candidate) { - if (Object.prototype.hasOwnProperty.call(candidate, key)) { - this._deeperArray(key); - this._validate(items, candidate[key]); - this._back(); - } - - } - } - } - }; - - var _asyncValidationAttribut = { - asyncExec: function (schema, candidate, callback) { - var self = this; - async.eachSeries(_typeIs.array(schema.exec) ? schema.exec : [schema.exec], function (exec, done) { - if (typeof exec === 'function') { - if (exec.length > 2) { - return exec.call(self, schema, candidate, done); - } - exec.call(self, schema, candidate); - } - async.nextTick(done); - }, callback); - }, - asyncProperties: function (schema, candidate, callback) { - if (!(schema.properties instanceof Object) || !_typeIs.object(candidate)) { - return callback(); - } - var self = this; - var properties = schema.properties; - async.series([ - function (next) { - if (properties['*'] == null) { - return next(); - } - async.eachSeries(Object.keys(candidate), function (i, done) { - if (i in properties) { - return async.nextTick(done); - } - self._deeperObject(i); - self._asyncValidate(properties['*'], candidate[i], function (err) { - self._back(); - done(err); - }); - }, next); - }, - function (next) { - async.eachSeries(Object.keys(properties), function (i, done) { - if (i === '*') { - return async.nextTick(done); - } - self._deeperObject(i); - self._asyncValidate(properties[i], candidate[i], function (err) { - self._back(); - done(err); - }); - }, next); - } - ], callback); - }, - asyncItems: function (schema, candidate, callback) { - if (!(schema.items instanceof Object) || !(candidate instanceof Object)) { - return callback(); - } - var self = this; - var items = schema.items; - var i, l; - - if (_typeIs.array(items) && _typeIs.array(candidate)) { - async.timesSeries(items.length, function (i, done) { - self._deeperArray(i); - self._asyncValidate(items[i], candidate[i], function (err, res) { - self._back(); - done(err, res); - }); - self._back(); - }, callback); - } - else { - async.eachSeries(Object.keys(candidate), function (key, done) { - self._deeperArray(key); - self._asyncValidate(items, candidate[key], function (err, res) { - self._back(); - done(err, res); - }); - }, callback); - } - } - }; - - // Validation Class ---------------------------------------------------------- - // inherits from Inspection class (actually we just call Inspection - // constructor with the new context, because its prototype is empty - function Validation(schema, custom) { - Inspection.prototype.constructor.call(this, schema, _merge(Validation.custom, custom)); - var _error = []; - - this._basicFields = Object.keys(_validationAttribut); - this._customFields = Object.keys(this._custom); - this.origin = null; - - this.report = function (message, code, reason) { - var newErr = { - code: code || this.userCode || null, - reason: reason || 'unknown', - message: this.userError || message || 'is invalid', - property: this.userAlias ? (this.userAlias + ' (' + this._dumpStack() + ')') : this._dumpStack() - }; - _error.push(newErr); - return this; - }; - - this.result = function () { - return { - error: _error, - valid: _error.length === 0, - format: function () { - if (this.valid === true) { - return 'Candidate is valid'; - } - return this.error.map(function (i) { - return 'Property ' + i.property + ': ' + i.message; - }).join('\n'); - } - }; - }; - } - - _extend(Validation.prototype, _validationAttribut); - _extend(Validation.prototype, _asyncValidationAttribut); - _extend(Validation, new Customisable()); - - Validation.prototype.validate = function (candidate, callback) { - this.origin = candidate; - if (typeof callback === 'function') { - var self = this; - return async.nextTick(function () { - self._asyncValidate(self._schema, candidate, function (err) { - self.origin = null; - callback(err, self.result()); - }); - }); - } - return this._validate(this._schema, candidate).result(); - }; - - Validation.prototype._validate = function (schema, candidate, callback) { - this.userCode = schema.code || null; - this.userError = schema.error || null; - this.userAlias = schema.alias || null; - this._basicFields.forEach(function (i) { - if ((i in schema || i === 'optional') && typeof this[i] === 'function') { - this[i](schema, candidate); - } - }, this); - this._customFields.forEach(function (i) { - if (i in schema && typeof this._custom[i] === 'function') { - this._custom[i].call(this, schema, candidate); - } - }, this); - return this; - }; - - Validation.prototype._asyncValidate = function (schema, candidate, callback) { - var self = this; - this.userCode = schema.code || null; - this.userError = schema.error || null; - this.userAlias = schema.alias || null; - - async.series([ - function (next) { - async.eachSeries(Object.keys(_validationAttribut), function (i, done) { - async.nextTick(function () { - if ((i in schema || i === 'optional') && typeof self[i] === 'function') { - if (self[i].length > 2) { - return self[i](schema, candidate, done); - } - self[i](schema, candidate); - } - done(); - }); - }, next); - }, - function (next) { - async.eachSeries(Object.keys(self._custom), function (i, done) { - async.nextTick(function () { - if (i in schema && typeof self._custom[i] === 'function') { - if (self._custom[i].length > 2) { - return self._custom[i].call(self, schema, candidate, done); - } - self._custom[i].call(self, schema, candidate); - } - done(); - }); - }, next); - } - ], callback); - }; - -// Sanitization ---------------------------------------------------------------- - // functions called by _sanitization.type method. - var _forceType = { - number: function (post, schema) { - var n; - if (typeof post === 'number') { - return post; - } - else if (post === '') { - if (typeof schema.def !== 'undefined') - return schema.def; - return null; - } - else if (typeof post === 'string') { - n = parseFloat(post.replace(/,/g, '.').replace(/ /g, '')); - if (typeof n === 'number') { - return n; - } - } - else if (post instanceof Date) { - return +post; - } - return null; - }, - integer: function (post, schema) { - var n; - if (typeof post === 'number' && post % 1 === 0) { - return post; - } - else if (post === '') { - if (typeof schema.def !== 'undefined') - return schema.def; - return null; - } - else if (typeof post === 'string') { - n = parseInt(post.replace(/ /g, ''), 10); - if (typeof n === 'number') { - return n; - } - } - else if (typeof post === 'number') { - return parseInt(post, 10); - } - else if (typeof post === 'boolean') { - if (post) { return 1; } - return 0; - } - else if (post instanceof Date) { - return +post; - } - return null; - }, - string: function (post, schema) { - if (typeof post === 'boolean' || typeof post === 'number' || post instanceof Date) { - return post.toString(); - } - else if (_typeIs.array(post)) { - // If user authorize array and strings... - if (schema.items || schema.properties) - return post; - return post.join(String(schema.joinWith || ',')); - } - else if (post instanceof Object) { - // If user authorize objects ans strings... - if (schema.items || schema.properties) - return post; - return JSON.stringify(post); - } - else if (typeof post === 'string' && post.length) { - return post; - } - return null; - }, - date: function (post, schema) { - if (post instanceof Date) { - return post; - } - else { - var d = new Date(post); - if (!isNaN(d.getTime())) { // if valid date - return d; - } - } - return null; - }, - boolean: function (post, schema) { - if (typeof post === 'undefined') return null; - if (typeof post === 'string' && post.toLowerCase() === 'false') return false; - return !!post; - }, - object: function (post, schema) { - if (typeof post !== 'string' || _typeIs.object(post)) { - return post; - } - try { - return JSON.parse(post); - } - catch (e) { - return null; - } - }, - array: function (post, schema) { - if (_typeIs.array(post)) - return post; - if (typeof post === 'undefined') - return null; - if (typeof post === 'string') { - if (post.substring(0,1) === '[' && post.slice(-1) === ']') { - try { - return JSON.parse(post); - } - catch (e) { - return null; - } - } - return post.split(String(schema.splitWith || ',')); - - } - if (!_typeIs.array(post)) - return [ post ]; - return null; - } - }; - - var _applyRules = { - upper: function (post) { - return post.toUpperCase(); - }, - lower: function (post) { - return post.toLowerCase(); - }, - title: function (post) { - // Fix by seb (replace \w\S* by \S* => exemple : coucou ça va) - return post.replace(/\S*/g, function (txt) { - return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); - }); - }, - capitalize: function (post) { - return post.charAt(0).toUpperCase() + post.substr(1).toLowerCase(); - }, - ucfirst: function (post) { - return post.charAt(0).toUpperCase() + post.substr(1); - }, - trim: function (post) { - return post.trim(); - } - }; - - // Every function return the future value of each property. Therefore you - // have to return post even if you do not change its value - var _sanitizationAttribut = { - strict: function (schema, post) { - if (typeof schema.strict === 'string') { schema.strict = (schema.strict === 'true'); } - if (schema.strict !== true) - return post; - if (!_typeIs.object(schema.properties)) - return post; - if (!_typeIs.object(post)) - return post; - var that = this; - Object.keys(post).forEach(function (key) { - if (!(key in schema.properties)) { - delete post[key]; - } - }); - return post; - }, - optional: function (schema, post) { - var opt = typeof schema.optional === 'boolean' ? schema.optional : (schema.optional !== 'false'); // Default: true - if (opt === true) { - return post; - } - if (typeof post !== 'undefined') { - return post; - } - this.report(); - if (schema.def === Date) { - return new Date(); - } - return schema.def; - }, - type: function (schema, post) { - // if (_typeIs['object'](post) || _typeIs.array(post)) { - // return post; - // } - if (typeof schema.type !== 'string' || typeof _forceType[schema.type] !== 'function') { - return post; - } - var n; - var opt = typeof schema.optional === 'boolean' ? schema.optional : true; - if (typeof _forceType[schema.type] === 'function') { - n = _forceType[schema.type](post, schema); - if ((n === null && !opt) || (!n && isNaN(n)) || (n === null && schema.type === 'string')) { - n = schema.def; - } - } - else if (!opt) { - n = schema.def; - } - if ((n != null || (typeof schema.def !== 'undefined' && schema.def === n)) && n !== post) { - this.report(); - return n; - } - return post; - }, - rules: function (schema, post) { - var rules = schema.rules; - if (typeof post !== 'string' || (typeof rules !== 'string' && !_typeIs.array(rules))) { - return post; - } - var modified = false; - (_typeIs.array(rules) ? rules : [rules]).forEach(function (rule) { - if (typeof _applyRules[rule] === 'function') { - post = _applyRules[rule](post); - modified = true; - } - }); - if (modified) { - this.report(); - } - return post; - }, - min: function (schema, post) { - var postTest = Number(post); - if (isNaN(postTest)) { - return post; - } - var min = Number(schema.min); - if (isNaN(min)) { - return post; - } - if (postTest < min) { - this.report(); - return min; - } - return post; - }, - max: function (schema, post) { - var postTest = Number(post); - if (isNaN(postTest)) { - return post; - } - var max = Number(schema.max); - if (isNaN(max)) { - return post; - } - if (postTest > max) { - this.report(); - return max; - } - return post; - }, - minLength: function (schema, post) { - var limit = Number(schema.minLength); - if (typeof post !== 'string' || isNaN(limit) || limit < 0) { - return post; - } - var str = ''; - var gap = limit - post.length; - if (gap > 0) { - for (var i = 0; i < gap; i++) { - str += '-'; - } - this.report(); - return post + str; - } - return post; - }, - maxLength: function (schema, post) { - var limit = Number(schema.maxLength); - if (typeof post !== 'string' || isNaN(limit) || limit < 0) { - return post; - } - if (post.length > limit) { - this.report(); - return post.slice(0, limit); - } - return post; - }, - properties: function (schema, post, callback) { - if (typeof callback === 'function') { - return this.asyncProperties(schema, post, callback); - } - if (!post || typeof post !== 'object') { - return post; - } - var properties = schema.properties; - var tmp; - var i; - if (typeof properties['*'] !== 'undefined') { - for (i in post) { - if (i in properties) { - continue; - } - this._deeperObject(i); - tmp = this._sanitize(schema.properties['*'], post[i]); - if (typeof tmp !== 'undefined') { - post[i]= tmp; - } - this._back(); - } - } - for (i in schema.properties) { - if (i !== '*') { - this._deeperObject(i); - tmp = this._sanitize(schema.properties[i], post[i]); - if (typeof tmp !== 'undefined') { - post[i]= tmp; - } - this._back(); - } - } - return post; - }, - items: function (schema, post, callback) { - if (typeof callback === 'function') { - return this.asyncItems(schema, post, callback); - } - if (!(schema.items instanceof Object) || !(post instanceof Object)) { - return post; - } - var i; - if (_typeIs.array(schema.items) && _typeIs.array(post)) { - var minLength = schema.items.length < post.length ? schema.items.length : post.length; - for (i = 0; i < minLength; i++) { - this._deeperArray(i); - post[i] = this._sanitize(schema.items[i], post[i]); - this._back(); - } - } - else { - for (i in post) { - if (Object.prototype.hasOwnProperty.call(post, i)) { - this._deeperArray(i); - post[i] = this._sanitize(schema.items, post[i]); - this._back(); - } - } - } - return post; - }, - exec: function (schema, post, callback) { - if (typeof callback === 'function') { - return this.asyncExec(schema, post, callback); - } - var execs = _typeIs.array(schema.exec) ? schema.exec : [schema.exec]; - - execs.forEach(function (exec) { - if (typeof exec === 'function') { - post = exec.call(this, schema, post); - } - }, this); - return post; - } - }; - - var _asyncSanitizationAttribut = { - asyncExec: function (schema, post, callback) { - var self = this; - var execs = _typeIs.array(schema.exec) ? schema.exec : [schema.exec]; - - async.eachSeries(execs, function (exec, done) { - if (typeof exec === 'function') { - if (exec.length > 2) { - return exec.call(self, schema, post, function (err, res) { - if (err) { - return done(err); - } - post = res; - done(); - }); - } - post = exec.call(self, schema, post); - } - done(); - }, function (err) { - callback(err, post); - }); - }, - asyncProperties: function (schema, post, callback) { - if (!post || typeof post !== 'object') { - return callback(null, post); - } - var self = this; - var properties = schema.properties; - - async.series([ - function (next) { - if (properties['*'] == null) { - return next(); - } - var globing = properties['*']; - async.eachSeries(Object.keys(post), function (i, next) { - if (i in properties) { - return next(); - } - self._deeperObject(i); - self._asyncSanitize(globing, post[i], function (err, res) { - if (err) { /* Error can safely be ignored here */ } - if (typeof res !== 'undefined') { - post[i] = res; - } - self._back(); - next(); - }); - }, next); - }, - function (next) { - async.eachSeries(Object.keys(properties), function (i, next) { - if (i === '*') { - return next(); - } - self._deeperObject(i); - self._asyncSanitize(properties[i], post[i], function (err, res) { - if (err) { - return next(err); - } - if (typeof res !== 'undefined') { - post[i] = res; - } - self._back(); - next(); - }); - }, next); - } - ], function (err) { - return callback(err, post); - }); - }, - asyncItems: function (schema, post, callback) { - if (!(schema.items instanceof Object) || !(post instanceof Object)) { - return callback(null, post); - } - var self = this; - var items = schema.items; - if (_typeIs.array(items) && _typeIs.array(post)) { - var minLength = items.length < post.length ? items.length : post.length; - async.timesSeries(minLength, function (i, next) { - self._deeperArray(i); - self._asyncSanitize(items[i], post[i], function (err, res) { - if (err) { - return next(err); - } - post[i] = res; - self._back(); - next(); - }); - }, function (err) { - callback(err, post); - }); - } - else { - async.eachSeries(Object.keys(post), function (key, next) { - self._deeperArray(key); - self._asyncSanitize(items, post[key], function (err, res) { - if (err) { - return next(); - } - post[key] = res; - self._back(); - next(); - }); - }, function (err) { - callback(err, post); - }); - } - return post; - } - }; - - // Sanitization Class -------------------------------------------------------- - // inherits from Inspection class (actually we just call Inspection - // constructor with the new context, because its prototype is empty - function Sanitization(schema, custom) { - Inspection.prototype.constructor.call(this, schema, _merge(Sanitization.custom, custom)); - var _reporting = []; - - this._basicFields = Object.keys(_sanitizationAttribut); - this._customFields = Object.keys(this._custom); - this.origin = null; - - this.report = function (message) { - var newNot = { - message: message || 'was sanitized', - property: this.userAlias ? (this.userAlias + ' (' + this._dumpStack() + ')') : this._dumpStack() - }; - if (!_reporting.some(function (e) { return e.property === newNot.property; })) { - _reporting.push(newNot); - } - }; - - this.result = function (data) { - return { - data: data, - reporting: _reporting, - format: function () { - return this.reporting.map(function (i) { - return 'Property ' + i.property + ' ' + i.message; - }).join('\n'); - } - }; - }; - } - - _extend(Sanitization.prototype, _sanitizationAttribut); - _extend(Sanitization.prototype, _asyncSanitizationAttribut); - _extend(Sanitization, new Customisable()); - - - Sanitization.prototype.sanitize = function (post, callback) { - this.origin = post; - if (typeof callback === 'function') { - var self = this; - return this._asyncSanitize(this._schema, post, function (err, data) { - self.origin = null; - callback(err, self.result(data)); - }); - } - var data = this._sanitize(this._schema, post); - this.origin = null; - return this.result(data); - }; - - Sanitization.prototype._sanitize = function (schema, post) { - this.userAlias = schema.alias || null; - this._basicFields.forEach(function (i) { - if ((i in schema || i === 'optional') && typeof this[i] === 'function') { - post = this[i](schema, post); - } - }, this); - this._customFields.forEach(function (i) { - if (i in schema && typeof this._custom[i] === 'function') { - post = this._custom[i].call(this, schema, post); - } - }, this); - return post; - }; - - Sanitization.prototype._asyncSanitize = function (schema, post, callback) { - var self = this; - this.userAlias = schema.alias || null; - - async.waterfall([ - function (next) { - async.reduce(self._basicFields, post, function (value, i, next) { - async.nextTick(function () { - if ((i in schema || i === 'optional') && typeof self[i] === 'function') { - if (self[i].length > 2) { - return self[i](schema, value, next); - } - value = self[i](schema, value); - } - next(null, value); - }); - }, next); - }, - function (inter, next) { - async.reduce(self._customFields, inter, function (value, i, next) { - async.nextTick(function () { - if (i in schema && typeof self._custom[i] === 'function') { - if (self._custom[i].length > 2) { - return self._custom[i].call(self, schema, value, next); - } - value = self._custom[i].call(self, schema, value); - } - next(null, value); - }); - }, next); - } - ], callback); - }; - - // --------------------------------------------------------------------------- - - var INT_MIN = -2147483648; - var INT_MAX = 2147483647; - - var _rand = { - int: function (min, max) { - return min + (0 | Math.random() * (max - min + 1)); - }, - float: function (min, max) { - return (Math.random() * (max - min) + min); - }, - bool: function () { - return (Math.random() > 0.5); - }, - char: function (min, max) { - return String.fromCharCode(this.int(min, max)); - }, - fromList: function (list) { - return list[this.int(0, list.length - 1)]; - } - }; - - var _formatSample = { - 'date-time': function () { - return new Date().toISOString(); - }, - 'date': function () { - return new Date().toISOString().replace(/T.*$/, ''); - }, - 'time': function () { - return new Date().toLocaleTimeString({}, { hour12: false }); - }, - 'color': function (min, max) { - var s = '#'; - if (min < 1) { - min = 1; - } - for (var i = 0, l = _rand.int(min, max); i < l; i++) { - s += _rand.fromList('0123456789abcdefABCDEF'); - } - return s; - }, - 'numeric': function () { - return '' + _rand.int(0, INT_MAX); - }, - 'integer': function () { - if (_rand.bool() === true) { - return '-' + this.numeric(); - } - return this.numeric(); - }, - 'decimal': function () { - return this.integer() + '.' + this.numeric(); - }, - 'alpha': function (min, max) { - var s = ''; - if (min < 1) { - min = 1; - } - for (var i = 0, l = _rand.int(min, max); i < l; i++) { - s += _rand.fromList('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'); - } - return s; - }, - 'alphaNumeric': function (min, max) { - var s = ''; - if (min < 1) { - min = 1; - } - for (var i = 0, l = _rand.int(min, max); i < l; i++) { - s += _rand.fromList('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'); - } - return s; - }, - 'alphaDash': function (min, max) { - var s = ''; - if (min < 1) { - min = 1; - } - for (var i = 0, l = _rand.int(min, max); i < l; i++) { - s += _rand.fromList('_-abcdefghijklmnopqrstuvwxyz_-ABCDEFGHIJKLMNOPQRSTUVWXYZ_-0123456789_-'); - } - return s; - }, - 'javascript': function (min, max) { - var s = _rand.fromList('_$abcdefghijklmnopqrstuvwxyz_$ABCDEFGHIJKLMNOPQRSTUVWXYZ_$'); - for (var i = 0, l = _rand.int(min, max - 1); i < l; i++) { - s += _rand.fromList('_$abcdefghijklmnopqrstuvwxyz_$ABCDEFGHIJKLMNOPQRSTUVWXYZ_$0123456789_$'); - } - return s; - } - }; - - function _getLimits(schema) { - var min = INT_MIN; - var max = INT_MAX; - - if (schema.gte != null) { - min = schema.gte; - } - else if (schema.gt != null) { - min = schema.gt + 1; - } - if (schema.lte != null) { - max = schema.lte; - } - else if (schema.lt != null) { - max = schema.lt - 1; - } - return { min: min, max: max }; - } - - var _typeGenerator = { - string: function (schema) { - if (schema.eq != null) { - return schema.eq; - } - var s = ''; - var minLength = schema.minLength != null ? schema.minLength : 0; - var maxLength = schema.maxLength != null ? schema.maxLength : 32; - if (typeof schema.pattern === 'string' && typeof _formatSample[schema.pattern] === 'function') { - return _formatSample[schema.pattern](minLength, maxLength); - } - - var l = schema.exactLength != null ? schema.exactLength : _rand.int(minLength, maxLength); - for (var i = 0; i < l; i++) { - s += _rand.char(32, 126); - } - return s; - }, - number: function (schema) { - if (schema.eq != null) { - return schema.eq; - } - var limit = _getLimits(schema); - var n = _rand.float(limit.min, limit.max); - if (schema.ne != null) { - var ne = _typeIs.array(schema.ne) ? schema.ne : [schema.ne]; - while (ne.indexOf(n) !== -1) { - n = _rand.float(limit.min, limit.max); - } - } - return n; - }, - integer: function (schema) { - if (schema.eq != null) { - return schema.eq; - } - var limit = _getLimits(schema); - var n = _rand.int(limit.min, limit.max); - if (schema.ne != null) { - var ne = _typeIs.array(schema.ne) ? schema.ne : [schema.ne]; - while (ne.indexOf(n) !== -1) { - n = _rand.int(limit.min, limit.max); - } - } - return n; - }, - boolean: function (schema) { - if (schema.eq != null) { - return schema.eq; - } - return _rand.bool(); - }, - "null": function (schema) { - return null; - }, - date: function (schema) { - if (schema.eq != null) { - return schema.eq; - } - return new Date(); - }, - object: function (schema) { - var o = {}; - var prop = schema.properties || {}; - - for (var key in prop) { - if (Object.prototype.hasOwnProperty.call(prop, key)) { - if (prop[key].optional === true && _rand.bool() === true) { - continue; - } - if (key !== '*') { - o[key] = this.generate(prop[key]); - } - else { - var rk = '__random_key_'; - var randomKey = rk + 0; - var n = _rand.int(1, 9); - for (var i = 1; i <= n; i++) { - if (!(randomKey in prop)) { - o[randomKey] = this.generate(prop[key]); - } - randomKey = rk + i; - } - } - } - } - return o; - }, - array: function (schema) { - var self = this; - var items = schema.items || {}; - var minLength = schema.minLength != null ? schema.minLength : 0; - var maxLength = schema.maxLength != null ? schema.maxLength : 16; - var type; - var candidate; - var size; - var i; - - if (_typeIs.array(items)) { - size = items.length; - if (schema.exactLength != null) { - size = schema.exactLength; - } - else if (size < minLength) { - size = minLength; - } - else if (size > maxLength) { - size = maxLength; - } - candidate = new Array(size); - type = null; - for (i = 0; i < size; i++) { - type = items[i].type || 'any'; - if (_typeIs.array(type)) { - type = type[_rand.int(0, type.length - 1)]; - } - candidate[i] = self[type](items[i]); - } - } - else { - size = schema.exactLength != null ? schema.exactLength : _rand.int(minLength, maxLength); - candidate = new Array(size); - type = items.type || 'any'; - if (_typeIs.array(type)) { - type = type[_rand.int(0, type.length - 1)]; - } - for (i = 0; i < size; i++) { - candidate[i] = self[type](items); - } - } - return candidate; - }, - any: function (schema) { - var fields = Object.keys(_typeGenerator); - var i = fields[_rand.int(0, fields.length - 2)]; - return this[i](schema); - } - }; - - // CandidateGenerator Class (Singleton) -------------------------------------- - function CandidateGenerator() { - // Maybe extends Inspection class too ? - } - - _extend(CandidateGenerator.prototype, _typeGenerator); - - var _instance = null; - CandidateGenerator.instance = function () { - if (!(_instance instanceof CandidateGenerator)) { - _instance = new CandidateGenerator(); - } - return _instance; - }; - - CandidateGenerator.prototype.generate = function (schema) { - var type = schema.type || 'any'; - if (_typeIs.array(type)) { - type = type[_rand.int(0, type.length - 1)]; - } - return this[type](schema); - }; - -// Exports --------------------------------------------------------------------- - var SchemaInspector = {}; - - // if server-side (node.js) else client-side - if (typeof module !== 'undefined' && module.exports) { - module.exports = SchemaInspector; - } - else { - window.SchemaInspector = SchemaInspector; - } - - SchemaInspector.newSanitization = function (schema, custom) { - return new Sanitization(schema, custom); - }; - - SchemaInspector.newValidation = function (schema, custom) { - return new Validation(schema, custom); - }; - - SchemaInspector.Validation = Validation; - SchemaInspector.Sanitization = Sanitization; - - SchemaInspector.sanitize = function (schema, post, custom, callback) { - if (arguments.length === 3 && typeof custom === 'function') { - callback = custom; - custom = null; - } - return new Sanitization(schema, custom).sanitize(post, callback); - }; - - SchemaInspector.validate = function (schema, candidate, custom, callback) { - if (arguments.length === 3 && typeof custom === 'function') { - callback = custom; - custom = null; - } - return new Validation(schema, custom).validate(candidate, callback); - }; - - SchemaInspector.generate = function (schema, n) { - if (typeof n === 'number') { - var r = new Array(n); - for (var i = 0; i < n; i++) { - r[i] = CandidateGenerator.instance().generate(schema); - } - return r; - } - return CandidateGenerator.instance().generate(schema); - }; -})(); - -},{"async":"AwTs"}],"YGFa":[function(require,module,exports) { -module.exports = require('./lib/schema-inspector'); - -},{"./lib/schema-inspector":"IEzs"}],"ENHQ":[function(require,module,exports) { -module.exports = {"0":65533,"128":8364,"130":8218,"131":402,"132":8222,"133":8230,"134":8224,"135":8225,"136":710,"137":8240,"138":352,"139":8249,"140":338,"142":381,"145":8216,"146":8217,"147":8220,"148":8221,"149":8226,"150":8211,"151":8212,"152":732,"153":8482,"154":353,"155":8250,"156":339,"158":382,"159":376}; -},{}],"FSTM":[function(require,module,exports) { -var decodeMap = require("../maps/decode.json"); - -module.exports = decodeCodePoint; - -// modified version of https://github.com/mathiasbynens/he/blob/master/src/he.js#L94-L119 -function decodeCodePoint(codePoint) { - if ((codePoint >= 0xd800 && codePoint <= 0xdfff) || codePoint > 0x10ffff) { - return "\uFFFD"; - } - - if (codePoint in decodeMap) { - codePoint = decodeMap[codePoint]; - } - - var output = ""; - - if (codePoint > 0xffff) { - codePoint -= 0x10000; - output += String.fromCharCode(((codePoint >>> 10) & 0x3ff) | 0xd800); - codePoint = 0xdc00 | (codePoint & 0x3ff); - } - - output += String.fromCharCode(codePoint); - return output; -} - -},{"../maps/decode.json":"ENHQ"}],"ExGN":[function(require,module,exports) { -module.exports = {"Aacute":"\u00C1","aacute":"\u00E1","Abreve":"\u0102","abreve":"\u0103","ac":"\u223E","acd":"\u223F","acE":"\u223E\u0333","Acirc":"\u00C2","acirc":"\u00E2","acute":"\u00B4","Acy":"\u0410","acy":"\u0430","AElig":"\u00C6","aelig":"\u00E6","af":"\u2061","Afr":"\uD835\uDD04","afr":"\uD835\uDD1E","Agrave":"\u00C0","agrave":"\u00E0","alefsym":"\u2135","aleph":"\u2135","Alpha":"\u0391","alpha":"\u03B1","Amacr":"\u0100","amacr":"\u0101","amalg":"\u2A3F","amp":"&","AMP":"&","andand":"\u2A55","And":"\u2A53","and":"\u2227","andd":"\u2A5C","andslope":"\u2A58","andv":"\u2A5A","ang":"\u2220","ange":"\u29A4","angle":"\u2220","angmsdaa":"\u29A8","angmsdab":"\u29A9","angmsdac":"\u29AA","angmsdad":"\u29AB","angmsdae":"\u29AC","angmsdaf":"\u29AD","angmsdag":"\u29AE","angmsdah":"\u29AF","angmsd":"\u2221","angrt":"\u221F","angrtvb":"\u22BE","angrtvbd":"\u299D","angsph":"\u2222","angst":"\u00C5","angzarr":"\u237C","Aogon":"\u0104","aogon":"\u0105","Aopf":"\uD835\uDD38","aopf":"\uD835\uDD52","apacir":"\u2A6F","ap":"\u2248","apE":"\u2A70","ape":"\u224A","apid":"\u224B","apos":"'","ApplyFunction":"\u2061","approx":"\u2248","approxeq":"\u224A","Aring":"\u00C5","aring":"\u00E5","Ascr":"\uD835\uDC9C","ascr":"\uD835\uDCB6","Assign":"\u2254","ast":"*","asymp":"\u2248","asympeq":"\u224D","Atilde":"\u00C3","atilde":"\u00E3","Auml":"\u00C4","auml":"\u00E4","awconint":"\u2233","awint":"\u2A11","backcong":"\u224C","backepsilon":"\u03F6","backprime":"\u2035","backsim":"\u223D","backsimeq":"\u22CD","Backslash":"\u2216","Barv":"\u2AE7","barvee":"\u22BD","barwed":"\u2305","Barwed":"\u2306","barwedge":"\u2305","bbrk":"\u23B5","bbrktbrk":"\u23B6","bcong":"\u224C","Bcy":"\u0411","bcy":"\u0431","bdquo":"\u201E","becaus":"\u2235","because":"\u2235","Because":"\u2235","bemptyv":"\u29B0","bepsi":"\u03F6","bernou":"\u212C","Bernoullis":"\u212C","Beta":"\u0392","beta":"\u03B2","beth":"\u2136","between":"\u226C","Bfr":"\uD835\uDD05","bfr":"\uD835\uDD1F","bigcap":"\u22C2","bigcirc":"\u25EF","bigcup":"\u22C3","bigodot":"\u2A00","bigoplus":"\u2A01","bigotimes":"\u2A02","bigsqcup":"\u2A06","bigstar":"\u2605","bigtriangledown":"\u25BD","bigtriangleup":"\u25B3","biguplus":"\u2A04","bigvee":"\u22C1","bigwedge":"\u22C0","bkarow":"\u290D","blacklozenge":"\u29EB","blacksquare":"\u25AA","blacktriangle":"\u25B4","blacktriangledown":"\u25BE","blacktriangleleft":"\u25C2","blacktriangleright":"\u25B8","blank":"\u2423","blk12":"\u2592","blk14":"\u2591","blk34":"\u2593","block":"\u2588","bne":"=\u20E5","bnequiv":"\u2261\u20E5","bNot":"\u2AED","bnot":"\u2310","Bopf":"\uD835\uDD39","bopf":"\uD835\uDD53","bot":"\u22A5","bottom":"\u22A5","bowtie":"\u22C8","boxbox":"\u29C9","boxdl":"\u2510","boxdL":"\u2555","boxDl":"\u2556","boxDL":"\u2557","boxdr":"\u250C","boxdR":"\u2552","boxDr":"\u2553","boxDR":"\u2554","boxh":"\u2500","boxH":"\u2550","boxhd":"\u252C","boxHd":"\u2564","boxhD":"\u2565","boxHD":"\u2566","boxhu":"\u2534","boxHu":"\u2567","boxhU":"\u2568","boxHU":"\u2569","boxminus":"\u229F","boxplus":"\u229E","boxtimes":"\u22A0","boxul":"\u2518","boxuL":"\u255B","boxUl":"\u255C","boxUL":"\u255D","boxur":"\u2514","boxuR":"\u2558","boxUr":"\u2559","boxUR":"\u255A","boxv":"\u2502","boxV":"\u2551","boxvh":"\u253C","boxvH":"\u256A","boxVh":"\u256B","boxVH":"\u256C","boxvl":"\u2524","boxvL":"\u2561","boxVl":"\u2562","boxVL":"\u2563","boxvr":"\u251C","boxvR":"\u255E","boxVr":"\u255F","boxVR":"\u2560","bprime":"\u2035","breve":"\u02D8","Breve":"\u02D8","brvbar":"\u00A6","bscr":"\uD835\uDCB7","Bscr":"\u212C","bsemi":"\u204F","bsim":"\u223D","bsime":"\u22CD","bsolb":"\u29C5","bsol":"\\","bsolhsub":"\u27C8","bull":"\u2022","bullet":"\u2022","bump":"\u224E","bumpE":"\u2AAE","bumpe":"\u224F","Bumpeq":"\u224E","bumpeq":"\u224F","Cacute":"\u0106","cacute":"\u0107","capand":"\u2A44","capbrcup":"\u2A49","capcap":"\u2A4B","cap":"\u2229","Cap":"\u22D2","capcup":"\u2A47","capdot":"\u2A40","CapitalDifferentialD":"\u2145","caps":"\u2229\uFE00","caret":"\u2041","caron":"\u02C7","Cayleys":"\u212D","ccaps":"\u2A4D","Ccaron":"\u010C","ccaron":"\u010D","Ccedil":"\u00C7","ccedil":"\u00E7","Ccirc":"\u0108","ccirc":"\u0109","Cconint":"\u2230","ccups":"\u2A4C","ccupssm":"\u2A50","Cdot":"\u010A","cdot":"\u010B","cedil":"\u00B8","Cedilla":"\u00B8","cemptyv":"\u29B2","cent":"\u00A2","centerdot":"\u00B7","CenterDot":"\u00B7","cfr":"\uD835\uDD20","Cfr":"\u212D","CHcy":"\u0427","chcy":"\u0447","check":"\u2713","checkmark":"\u2713","Chi":"\u03A7","chi":"\u03C7","circ":"\u02C6","circeq":"\u2257","circlearrowleft":"\u21BA","circlearrowright":"\u21BB","circledast":"\u229B","circledcirc":"\u229A","circleddash":"\u229D","CircleDot":"\u2299","circledR":"\u00AE","circledS":"\u24C8","CircleMinus":"\u2296","CirclePlus":"\u2295","CircleTimes":"\u2297","cir":"\u25CB","cirE":"\u29C3","cire":"\u2257","cirfnint":"\u2A10","cirmid":"\u2AEF","cirscir":"\u29C2","ClockwiseContourIntegral":"\u2232","CloseCurlyDoubleQuote":"\u201D","CloseCurlyQuote":"\u2019","clubs":"\u2663","clubsuit":"\u2663","colon":":","Colon":"\u2237","Colone":"\u2A74","colone":"\u2254","coloneq":"\u2254","comma":",","commat":"@","comp":"\u2201","compfn":"\u2218","complement":"\u2201","complexes":"\u2102","cong":"\u2245","congdot":"\u2A6D","Congruent":"\u2261","conint":"\u222E","Conint":"\u222F","ContourIntegral":"\u222E","copf":"\uD835\uDD54","Copf":"\u2102","coprod":"\u2210","Coproduct":"\u2210","copy":"\u00A9","COPY":"\u00A9","copysr":"\u2117","CounterClockwiseContourIntegral":"\u2233","crarr":"\u21B5","cross":"\u2717","Cross":"\u2A2F","Cscr":"\uD835\uDC9E","cscr":"\uD835\uDCB8","csub":"\u2ACF","csube":"\u2AD1","csup":"\u2AD0","csupe":"\u2AD2","ctdot":"\u22EF","cudarrl":"\u2938","cudarrr":"\u2935","cuepr":"\u22DE","cuesc":"\u22DF","cularr":"\u21B6","cularrp":"\u293D","cupbrcap":"\u2A48","cupcap":"\u2A46","CupCap":"\u224D","cup":"\u222A","Cup":"\u22D3","cupcup":"\u2A4A","cupdot":"\u228D","cupor":"\u2A45","cups":"\u222A\uFE00","curarr":"\u21B7","curarrm":"\u293C","curlyeqprec":"\u22DE","curlyeqsucc":"\u22DF","curlyvee":"\u22CE","curlywedge":"\u22CF","curren":"\u00A4","curvearrowleft":"\u21B6","curvearrowright":"\u21B7","cuvee":"\u22CE","cuwed":"\u22CF","cwconint":"\u2232","cwint":"\u2231","cylcty":"\u232D","dagger":"\u2020","Dagger":"\u2021","daleth":"\u2138","darr":"\u2193","Darr":"\u21A1","dArr":"\u21D3","dash":"\u2010","Dashv":"\u2AE4","dashv":"\u22A3","dbkarow":"\u290F","dblac":"\u02DD","Dcaron":"\u010E","dcaron":"\u010F","Dcy":"\u0414","dcy":"\u0434","ddagger":"\u2021","ddarr":"\u21CA","DD":"\u2145","dd":"\u2146","DDotrahd":"\u2911","ddotseq":"\u2A77","deg":"\u00B0","Del":"\u2207","Delta":"\u0394","delta":"\u03B4","demptyv":"\u29B1","dfisht":"\u297F","Dfr":"\uD835\uDD07","dfr":"\uD835\uDD21","dHar":"\u2965","dharl":"\u21C3","dharr":"\u21C2","DiacriticalAcute":"\u00B4","DiacriticalDot":"\u02D9","DiacriticalDoubleAcute":"\u02DD","DiacriticalGrave":"`","DiacriticalTilde":"\u02DC","diam":"\u22C4","diamond":"\u22C4","Diamond":"\u22C4","diamondsuit":"\u2666","diams":"\u2666","die":"\u00A8","DifferentialD":"\u2146","digamma":"\u03DD","disin":"\u22F2","div":"\u00F7","divide":"\u00F7","divideontimes":"\u22C7","divonx":"\u22C7","DJcy":"\u0402","djcy":"\u0452","dlcorn":"\u231E","dlcrop":"\u230D","dollar":"$","Dopf":"\uD835\uDD3B","dopf":"\uD835\uDD55","Dot":"\u00A8","dot":"\u02D9","DotDot":"\u20DC","doteq":"\u2250","doteqdot":"\u2251","DotEqual":"\u2250","dotminus":"\u2238","dotplus":"\u2214","dotsquare":"\u22A1","doublebarwedge":"\u2306","DoubleContourIntegral":"\u222F","DoubleDot":"\u00A8","DoubleDownArrow":"\u21D3","DoubleLeftArrow":"\u21D0","DoubleLeftRightArrow":"\u21D4","DoubleLeftTee":"\u2AE4","DoubleLongLeftArrow":"\u27F8","DoubleLongLeftRightArrow":"\u27FA","DoubleLongRightArrow":"\u27F9","DoubleRightArrow":"\u21D2","DoubleRightTee":"\u22A8","DoubleUpArrow":"\u21D1","DoubleUpDownArrow":"\u21D5","DoubleVerticalBar":"\u2225","DownArrowBar":"\u2913","downarrow":"\u2193","DownArrow":"\u2193","Downarrow":"\u21D3","DownArrowUpArrow":"\u21F5","DownBreve":"\u0311","downdownarrows":"\u21CA","downharpoonleft":"\u21C3","downharpoonright":"\u21C2","DownLeftRightVector":"\u2950","DownLeftTeeVector":"\u295E","DownLeftVectorBar":"\u2956","DownLeftVector":"\u21BD","DownRightTeeVector":"\u295F","DownRightVectorBar":"\u2957","DownRightVector":"\u21C1","DownTeeArrow":"\u21A7","DownTee":"\u22A4","drbkarow":"\u2910","drcorn":"\u231F","drcrop":"\u230C","Dscr":"\uD835\uDC9F","dscr":"\uD835\uDCB9","DScy":"\u0405","dscy":"\u0455","dsol":"\u29F6","Dstrok":"\u0110","dstrok":"\u0111","dtdot":"\u22F1","dtri":"\u25BF","dtrif":"\u25BE","duarr":"\u21F5","duhar":"\u296F","dwangle":"\u29A6","DZcy":"\u040F","dzcy":"\u045F","dzigrarr":"\u27FF","Eacute":"\u00C9","eacute":"\u00E9","easter":"\u2A6E","Ecaron":"\u011A","ecaron":"\u011B","Ecirc":"\u00CA","ecirc":"\u00EA","ecir":"\u2256","ecolon":"\u2255","Ecy":"\u042D","ecy":"\u044D","eDDot":"\u2A77","Edot":"\u0116","edot":"\u0117","eDot":"\u2251","ee":"\u2147","efDot":"\u2252","Efr":"\uD835\uDD08","efr":"\uD835\uDD22","eg":"\u2A9A","Egrave":"\u00C8","egrave":"\u00E8","egs":"\u2A96","egsdot":"\u2A98","el":"\u2A99","Element":"\u2208","elinters":"\u23E7","ell":"\u2113","els":"\u2A95","elsdot":"\u2A97","Emacr":"\u0112","emacr":"\u0113","empty":"\u2205","emptyset":"\u2205","EmptySmallSquare":"\u25FB","emptyv":"\u2205","EmptyVerySmallSquare":"\u25AB","emsp13":"\u2004","emsp14":"\u2005","emsp":"\u2003","ENG":"\u014A","eng":"\u014B","ensp":"\u2002","Eogon":"\u0118","eogon":"\u0119","Eopf":"\uD835\uDD3C","eopf":"\uD835\uDD56","epar":"\u22D5","eparsl":"\u29E3","eplus":"\u2A71","epsi":"\u03B5","Epsilon":"\u0395","epsilon":"\u03B5","epsiv":"\u03F5","eqcirc":"\u2256","eqcolon":"\u2255","eqsim":"\u2242","eqslantgtr":"\u2A96","eqslantless":"\u2A95","Equal":"\u2A75","equals":"=","EqualTilde":"\u2242","equest":"\u225F","Equilibrium":"\u21CC","equiv":"\u2261","equivDD":"\u2A78","eqvparsl":"\u29E5","erarr":"\u2971","erDot":"\u2253","escr":"\u212F","Escr":"\u2130","esdot":"\u2250","Esim":"\u2A73","esim":"\u2242","Eta":"\u0397","eta":"\u03B7","ETH":"\u00D0","eth":"\u00F0","Euml":"\u00CB","euml":"\u00EB","euro":"\u20AC","excl":"!","exist":"\u2203","Exists":"\u2203","expectation":"\u2130","exponentiale":"\u2147","ExponentialE":"\u2147","fallingdotseq":"\u2252","Fcy":"\u0424","fcy":"\u0444","female":"\u2640","ffilig":"\uFB03","fflig":"\uFB00","ffllig":"\uFB04","Ffr":"\uD835\uDD09","ffr":"\uD835\uDD23","filig":"\uFB01","FilledSmallSquare":"\u25FC","FilledVerySmallSquare":"\u25AA","fjlig":"fj","flat":"\u266D","fllig":"\uFB02","fltns":"\u25B1","fnof":"\u0192","Fopf":"\uD835\uDD3D","fopf":"\uD835\uDD57","forall":"\u2200","ForAll":"\u2200","fork":"\u22D4","forkv":"\u2AD9","Fouriertrf":"\u2131","fpartint":"\u2A0D","frac12":"\u00BD","frac13":"\u2153","frac14":"\u00BC","frac15":"\u2155","frac16":"\u2159","frac18":"\u215B","frac23":"\u2154","frac25":"\u2156","frac34":"\u00BE","frac35":"\u2157","frac38":"\u215C","frac45":"\u2158","frac56":"\u215A","frac58":"\u215D","frac78":"\u215E","frasl":"\u2044","frown":"\u2322","fscr":"\uD835\uDCBB","Fscr":"\u2131","gacute":"\u01F5","Gamma":"\u0393","gamma":"\u03B3","Gammad":"\u03DC","gammad":"\u03DD","gap":"\u2A86","Gbreve":"\u011E","gbreve":"\u011F","Gcedil":"\u0122","Gcirc":"\u011C","gcirc":"\u011D","Gcy":"\u0413","gcy":"\u0433","Gdot":"\u0120","gdot":"\u0121","ge":"\u2265","gE":"\u2267","gEl":"\u2A8C","gel":"\u22DB","geq":"\u2265","geqq":"\u2267","geqslant":"\u2A7E","gescc":"\u2AA9","ges":"\u2A7E","gesdot":"\u2A80","gesdoto":"\u2A82","gesdotol":"\u2A84","gesl":"\u22DB\uFE00","gesles":"\u2A94","Gfr":"\uD835\uDD0A","gfr":"\uD835\uDD24","gg":"\u226B","Gg":"\u22D9","ggg":"\u22D9","gimel":"\u2137","GJcy":"\u0403","gjcy":"\u0453","gla":"\u2AA5","gl":"\u2277","glE":"\u2A92","glj":"\u2AA4","gnap":"\u2A8A","gnapprox":"\u2A8A","gne":"\u2A88","gnE":"\u2269","gneq":"\u2A88","gneqq":"\u2269","gnsim":"\u22E7","Gopf":"\uD835\uDD3E","gopf":"\uD835\uDD58","grave":"`","GreaterEqual":"\u2265","GreaterEqualLess":"\u22DB","GreaterFullEqual":"\u2267","GreaterGreater":"\u2AA2","GreaterLess":"\u2277","GreaterSlantEqual":"\u2A7E","GreaterTilde":"\u2273","Gscr":"\uD835\uDCA2","gscr":"\u210A","gsim":"\u2273","gsime":"\u2A8E","gsiml":"\u2A90","gtcc":"\u2AA7","gtcir":"\u2A7A","gt":">","GT":">","Gt":"\u226B","gtdot":"\u22D7","gtlPar":"\u2995","gtquest":"\u2A7C","gtrapprox":"\u2A86","gtrarr":"\u2978","gtrdot":"\u22D7","gtreqless":"\u22DB","gtreqqless":"\u2A8C","gtrless":"\u2277","gtrsim":"\u2273","gvertneqq":"\u2269\uFE00","gvnE":"\u2269\uFE00","Hacek":"\u02C7","hairsp":"\u200A","half":"\u00BD","hamilt":"\u210B","HARDcy":"\u042A","hardcy":"\u044A","harrcir":"\u2948","harr":"\u2194","hArr":"\u21D4","harrw":"\u21AD","Hat":"^","hbar":"\u210F","Hcirc":"\u0124","hcirc":"\u0125","hearts":"\u2665","heartsuit":"\u2665","hellip":"\u2026","hercon":"\u22B9","hfr":"\uD835\uDD25","Hfr":"\u210C","HilbertSpace":"\u210B","hksearow":"\u2925","hkswarow":"\u2926","hoarr":"\u21FF","homtht":"\u223B","hookleftarrow":"\u21A9","hookrightarrow":"\u21AA","hopf":"\uD835\uDD59","Hopf":"\u210D","horbar":"\u2015","HorizontalLine":"\u2500","hscr":"\uD835\uDCBD","Hscr":"\u210B","hslash":"\u210F","Hstrok":"\u0126","hstrok":"\u0127","HumpDownHump":"\u224E","HumpEqual":"\u224F","hybull":"\u2043","hyphen":"\u2010","Iacute":"\u00CD","iacute":"\u00ED","ic":"\u2063","Icirc":"\u00CE","icirc":"\u00EE","Icy":"\u0418","icy":"\u0438","Idot":"\u0130","IEcy":"\u0415","iecy":"\u0435","iexcl":"\u00A1","iff":"\u21D4","ifr":"\uD835\uDD26","Ifr":"\u2111","Igrave":"\u00CC","igrave":"\u00EC","ii":"\u2148","iiiint":"\u2A0C","iiint":"\u222D","iinfin":"\u29DC","iiota":"\u2129","IJlig":"\u0132","ijlig":"\u0133","Imacr":"\u012A","imacr":"\u012B","image":"\u2111","ImaginaryI":"\u2148","imagline":"\u2110","imagpart":"\u2111","imath":"\u0131","Im":"\u2111","imof":"\u22B7","imped":"\u01B5","Implies":"\u21D2","incare":"\u2105","in":"\u2208","infin":"\u221E","infintie":"\u29DD","inodot":"\u0131","intcal":"\u22BA","int":"\u222B","Int":"\u222C","integers":"\u2124","Integral":"\u222B","intercal":"\u22BA","Intersection":"\u22C2","intlarhk":"\u2A17","intprod":"\u2A3C","InvisibleComma":"\u2063","InvisibleTimes":"\u2062","IOcy":"\u0401","iocy":"\u0451","Iogon":"\u012E","iogon":"\u012F","Iopf":"\uD835\uDD40","iopf":"\uD835\uDD5A","Iota":"\u0399","iota":"\u03B9","iprod":"\u2A3C","iquest":"\u00BF","iscr":"\uD835\uDCBE","Iscr":"\u2110","isin":"\u2208","isindot":"\u22F5","isinE":"\u22F9","isins":"\u22F4","isinsv":"\u22F3","isinv":"\u2208","it":"\u2062","Itilde":"\u0128","itilde":"\u0129","Iukcy":"\u0406","iukcy":"\u0456","Iuml":"\u00CF","iuml":"\u00EF","Jcirc":"\u0134","jcirc":"\u0135","Jcy":"\u0419","jcy":"\u0439","Jfr":"\uD835\uDD0D","jfr":"\uD835\uDD27","jmath":"\u0237","Jopf":"\uD835\uDD41","jopf":"\uD835\uDD5B","Jscr":"\uD835\uDCA5","jscr":"\uD835\uDCBF","Jsercy":"\u0408","jsercy":"\u0458","Jukcy":"\u0404","jukcy":"\u0454","Kappa":"\u039A","kappa":"\u03BA","kappav":"\u03F0","Kcedil":"\u0136","kcedil":"\u0137","Kcy":"\u041A","kcy":"\u043A","Kfr":"\uD835\uDD0E","kfr":"\uD835\uDD28","kgreen":"\u0138","KHcy":"\u0425","khcy":"\u0445","KJcy":"\u040C","kjcy":"\u045C","Kopf":"\uD835\uDD42","kopf":"\uD835\uDD5C","Kscr":"\uD835\uDCA6","kscr":"\uD835\uDCC0","lAarr":"\u21DA","Lacute":"\u0139","lacute":"\u013A","laemptyv":"\u29B4","lagran":"\u2112","Lambda":"\u039B","lambda":"\u03BB","lang":"\u27E8","Lang":"\u27EA","langd":"\u2991","langle":"\u27E8","lap":"\u2A85","Laplacetrf":"\u2112","laquo":"\u00AB","larrb":"\u21E4","larrbfs":"\u291F","larr":"\u2190","Larr":"\u219E","lArr":"\u21D0","larrfs":"\u291D","larrhk":"\u21A9","larrlp":"\u21AB","larrpl":"\u2939","larrsim":"\u2973","larrtl":"\u21A2","latail":"\u2919","lAtail":"\u291B","lat":"\u2AAB","late":"\u2AAD","lates":"\u2AAD\uFE00","lbarr":"\u290C","lBarr":"\u290E","lbbrk":"\u2772","lbrace":"{","lbrack":"[","lbrke":"\u298B","lbrksld":"\u298F","lbrkslu":"\u298D","Lcaron":"\u013D","lcaron":"\u013E","Lcedil":"\u013B","lcedil":"\u013C","lceil":"\u2308","lcub":"{","Lcy":"\u041B","lcy":"\u043B","ldca":"\u2936","ldquo":"\u201C","ldquor":"\u201E","ldrdhar":"\u2967","ldrushar":"\u294B","ldsh":"\u21B2","le":"\u2264","lE":"\u2266","LeftAngleBracket":"\u27E8","LeftArrowBar":"\u21E4","leftarrow":"\u2190","LeftArrow":"\u2190","Leftarrow":"\u21D0","LeftArrowRightArrow":"\u21C6","leftarrowtail":"\u21A2","LeftCeiling":"\u2308","LeftDoubleBracket":"\u27E6","LeftDownTeeVector":"\u2961","LeftDownVectorBar":"\u2959","LeftDownVector":"\u21C3","LeftFloor":"\u230A","leftharpoondown":"\u21BD","leftharpoonup":"\u21BC","leftleftarrows":"\u21C7","leftrightarrow":"\u2194","LeftRightArrow":"\u2194","Leftrightarrow":"\u21D4","leftrightarrows":"\u21C6","leftrightharpoons":"\u21CB","leftrightsquigarrow":"\u21AD","LeftRightVector":"\u294E","LeftTeeArrow":"\u21A4","LeftTee":"\u22A3","LeftTeeVector":"\u295A","leftthreetimes":"\u22CB","LeftTriangleBar":"\u29CF","LeftTriangle":"\u22B2","LeftTriangleEqual":"\u22B4","LeftUpDownVector":"\u2951","LeftUpTeeVector":"\u2960","LeftUpVectorBar":"\u2958","LeftUpVector":"\u21BF","LeftVectorBar":"\u2952","LeftVector":"\u21BC","lEg":"\u2A8B","leg":"\u22DA","leq":"\u2264","leqq":"\u2266","leqslant":"\u2A7D","lescc":"\u2AA8","les":"\u2A7D","lesdot":"\u2A7F","lesdoto":"\u2A81","lesdotor":"\u2A83","lesg":"\u22DA\uFE00","lesges":"\u2A93","lessapprox":"\u2A85","lessdot":"\u22D6","lesseqgtr":"\u22DA","lesseqqgtr":"\u2A8B","LessEqualGreater":"\u22DA","LessFullEqual":"\u2266","LessGreater":"\u2276","lessgtr":"\u2276","LessLess":"\u2AA1","lesssim":"\u2272","LessSlantEqual":"\u2A7D","LessTilde":"\u2272","lfisht":"\u297C","lfloor":"\u230A","Lfr":"\uD835\uDD0F","lfr":"\uD835\uDD29","lg":"\u2276","lgE":"\u2A91","lHar":"\u2962","lhard":"\u21BD","lharu":"\u21BC","lharul":"\u296A","lhblk":"\u2584","LJcy":"\u0409","ljcy":"\u0459","llarr":"\u21C7","ll":"\u226A","Ll":"\u22D8","llcorner":"\u231E","Lleftarrow":"\u21DA","llhard":"\u296B","lltri":"\u25FA","Lmidot":"\u013F","lmidot":"\u0140","lmoustache":"\u23B0","lmoust":"\u23B0","lnap":"\u2A89","lnapprox":"\u2A89","lne":"\u2A87","lnE":"\u2268","lneq":"\u2A87","lneqq":"\u2268","lnsim":"\u22E6","loang":"\u27EC","loarr":"\u21FD","lobrk":"\u27E6","longleftarrow":"\u27F5","LongLeftArrow":"\u27F5","Longleftarrow":"\u27F8","longleftrightarrow":"\u27F7","LongLeftRightArrow":"\u27F7","Longleftrightarrow":"\u27FA","longmapsto":"\u27FC","longrightarrow":"\u27F6","LongRightArrow":"\u27F6","Longrightarrow":"\u27F9","looparrowleft":"\u21AB","looparrowright":"\u21AC","lopar":"\u2985","Lopf":"\uD835\uDD43","lopf":"\uD835\uDD5D","loplus":"\u2A2D","lotimes":"\u2A34","lowast":"\u2217","lowbar":"_","LowerLeftArrow":"\u2199","LowerRightArrow":"\u2198","loz":"\u25CA","lozenge":"\u25CA","lozf":"\u29EB","lpar":"(","lparlt":"\u2993","lrarr":"\u21C6","lrcorner":"\u231F","lrhar":"\u21CB","lrhard":"\u296D","lrm":"\u200E","lrtri":"\u22BF","lsaquo":"\u2039","lscr":"\uD835\uDCC1","Lscr":"\u2112","lsh":"\u21B0","Lsh":"\u21B0","lsim":"\u2272","lsime":"\u2A8D","lsimg":"\u2A8F","lsqb":"[","lsquo":"\u2018","lsquor":"\u201A","Lstrok":"\u0141","lstrok":"\u0142","ltcc":"\u2AA6","ltcir":"\u2A79","lt":"<","LT":"<","Lt":"\u226A","ltdot":"\u22D6","lthree":"\u22CB","ltimes":"\u22C9","ltlarr":"\u2976","ltquest":"\u2A7B","ltri":"\u25C3","ltrie":"\u22B4","ltrif":"\u25C2","ltrPar":"\u2996","lurdshar":"\u294A","luruhar":"\u2966","lvertneqq":"\u2268\uFE00","lvnE":"\u2268\uFE00","macr":"\u00AF","male":"\u2642","malt":"\u2720","maltese":"\u2720","Map":"\u2905","map":"\u21A6","mapsto":"\u21A6","mapstodown":"\u21A7","mapstoleft":"\u21A4","mapstoup":"\u21A5","marker":"\u25AE","mcomma":"\u2A29","Mcy":"\u041C","mcy":"\u043C","mdash":"\u2014","mDDot":"\u223A","measuredangle":"\u2221","MediumSpace":"\u205F","Mellintrf":"\u2133","Mfr":"\uD835\uDD10","mfr":"\uD835\uDD2A","mho":"\u2127","micro":"\u00B5","midast":"*","midcir":"\u2AF0","mid":"\u2223","middot":"\u00B7","minusb":"\u229F","minus":"\u2212","minusd":"\u2238","minusdu":"\u2A2A","MinusPlus":"\u2213","mlcp":"\u2ADB","mldr":"\u2026","mnplus":"\u2213","models":"\u22A7","Mopf":"\uD835\uDD44","mopf":"\uD835\uDD5E","mp":"\u2213","mscr":"\uD835\uDCC2","Mscr":"\u2133","mstpos":"\u223E","Mu":"\u039C","mu":"\u03BC","multimap":"\u22B8","mumap":"\u22B8","nabla":"\u2207","Nacute":"\u0143","nacute":"\u0144","nang":"\u2220\u20D2","nap":"\u2249","napE":"\u2A70\u0338","napid":"\u224B\u0338","napos":"\u0149","napprox":"\u2249","natural":"\u266E","naturals":"\u2115","natur":"\u266E","nbsp":"\u00A0","nbump":"\u224E\u0338","nbumpe":"\u224F\u0338","ncap":"\u2A43","Ncaron":"\u0147","ncaron":"\u0148","Ncedil":"\u0145","ncedil":"\u0146","ncong":"\u2247","ncongdot":"\u2A6D\u0338","ncup":"\u2A42","Ncy":"\u041D","ncy":"\u043D","ndash":"\u2013","nearhk":"\u2924","nearr":"\u2197","neArr":"\u21D7","nearrow":"\u2197","ne":"\u2260","nedot":"\u2250\u0338","NegativeMediumSpace":"\u200B","NegativeThickSpace":"\u200B","NegativeThinSpace":"\u200B","NegativeVeryThinSpace":"\u200B","nequiv":"\u2262","nesear":"\u2928","nesim":"\u2242\u0338","NestedGreaterGreater":"\u226B","NestedLessLess":"\u226A","NewLine":"\n","nexist":"\u2204","nexists":"\u2204","Nfr":"\uD835\uDD11","nfr":"\uD835\uDD2B","ngE":"\u2267\u0338","nge":"\u2271","ngeq":"\u2271","ngeqq":"\u2267\u0338","ngeqslant":"\u2A7E\u0338","nges":"\u2A7E\u0338","nGg":"\u22D9\u0338","ngsim":"\u2275","nGt":"\u226B\u20D2","ngt":"\u226F","ngtr":"\u226F","nGtv":"\u226B\u0338","nharr":"\u21AE","nhArr":"\u21CE","nhpar":"\u2AF2","ni":"\u220B","nis":"\u22FC","nisd":"\u22FA","niv":"\u220B","NJcy":"\u040A","njcy":"\u045A","nlarr":"\u219A","nlArr":"\u21CD","nldr":"\u2025","nlE":"\u2266\u0338","nle":"\u2270","nleftarrow":"\u219A","nLeftarrow":"\u21CD","nleftrightarrow":"\u21AE","nLeftrightarrow":"\u21CE","nleq":"\u2270","nleqq":"\u2266\u0338","nleqslant":"\u2A7D\u0338","nles":"\u2A7D\u0338","nless":"\u226E","nLl":"\u22D8\u0338","nlsim":"\u2274","nLt":"\u226A\u20D2","nlt":"\u226E","nltri":"\u22EA","nltrie":"\u22EC","nLtv":"\u226A\u0338","nmid":"\u2224","NoBreak":"\u2060","NonBreakingSpace":"\u00A0","nopf":"\uD835\uDD5F","Nopf":"\u2115","Not":"\u2AEC","not":"\u00AC","NotCongruent":"\u2262","NotCupCap":"\u226D","NotDoubleVerticalBar":"\u2226","NotElement":"\u2209","NotEqual":"\u2260","NotEqualTilde":"\u2242\u0338","NotExists":"\u2204","NotGreater":"\u226F","NotGreaterEqual":"\u2271","NotGreaterFullEqual":"\u2267\u0338","NotGreaterGreater":"\u226B\u0338","NotGreaterLess":"\u2279","NotGreaterSlantEqual":"\u2A7E\u0338","NotGreaterTilde":"\u2275","NotHumpDownHump":"\u224E\u0338","NotHumpEqual":"\u224F\u0338","notin":"\u2209","notindot":"\u22F5\u0338","notinE":"\u22F9\u0338","notinva":"\u2209","notinvb":"\u22F7","notinvc":"\u22F6","NotLeftTriangleBar":"\u29CF\u0338","NotLeftTriangle":"\u22EA","NotLeftTriangleEqual":"\u22EC","NotLess":"\u226E","NotLessEqual":"\u2270","NotLessGreater":"\u2278","NotLessLess":"\u226A\u0338","NotLessSlantEqual":"\u2A7D\u0338","NotLessTilde":"\u2274","NotNestedGreaterGreater":"\u2AA2\u0338","NotNestedLessLess":"\u2AA1\u0338","notni":"\u220C","notniva":"\u220C","notnivb":"\u22FE","notnivc":"\u22FD","NotPrecedes":"\u2280","NotPrecedesEqual":"\u2AAF\u0338","NotPrecedesSlantEqual":"\u22E0","NotReverseElement":"\u220C","NotRightTriangleBar":"\u29D0\u0338","NotRightTriangle":"\u22EB","NotRightTriangleEqual":"\u22ED","NotSquareSubset":"\u228F\u0338","NotSquareSubsetEqual":"\u22E2","NotSquareSuperset":"\u2290\u0338","NotSquareSupersetEqual":"\u22E3","NotSubset":"\u2282\u20D2","NotSubsetEqual":"\u2288","NotSucceeds":"\u2281","NotSucceedsEqual":"\u2AB0\u0338","NotSucceedsSlantEqual":"\u22E1","NotSucceedsTilde":"\u227F\u0338","NotSuperset":"\u2283\u20D2","NotSupersetEqual":"\u2289","NotTilde":"\u2241","NotTildeEqual":"\u2244","NotTildeFullEqual":"\u2247","NotTildeTilde":"\u2249","NotVerticalBar":"\u2224","nparallel":"\u2226","npar":"\u2226","nparsl":"\u2AFD\u20E5","npart":"\u2202\u0338","npolint":"\u2A14","npr":"\u2280","nprcue":"\u22E0","nprec":"\u2280","npreceq":"\u2AAF\u0338","npre":"\u2AAF\u0338","nrarrc":"\u2933\u0338","nrarr":"\u219B","nrArr":"\u21CF","nrarrw":"\u219D\u0338","nrightarrow":"\u219B","nRightarrow":"\u21CF","nrtri":"\u22EB","nrtrie":"\u22ED","nsc":"\u2281","nsccue":"\u22E1","nsce":"\u2AB0\u0338","Nscr":"\uD835\uDCA9","nscr":"\uD835\uDCC3","nshortmid":"\u2224","nshortparallel":"\u2226","nsim":"\u2241","nsime":"\u2244","nsimeq":"\u2244","nsmid":"\u2224","nspar":"\u2226","nsqsube":"\u22E2","nsqsupe":"\u22E3","nsub":"\u2284","nsubE":"\u2AC5\u0338","nsube":"\u2288","nsubset":"\u2282\u20D2","nsubseteq":"\u2288","nsubseteqq":"\u2AC5\u0338","nsucc":"\u2281","nsucceq":"\u2AB0\u0338","nsup":"\u2285","nsupE":"\u2AC6\u0338","nsupe":"\u2289","nsupset":"\u2283\u20D2","nsupseteq":"\u2289","nsupseteqq":"\u2AC6\u0338","ntgl":"\u2279","Ntilde":"\u00D1","ntilde":"\u00F1","ntlg":"\u2278","ntriangleleft":"\u22EA","ntrianglelefteq":"\u22EC","ntriangleright":"\u22EB","ntrianglerighteq":"\u22ED","Nu":"\u039D","nu":"\u03BD","num":"#","numero":"\u2116","numsp":"\u2007","nvap":"\u224D\u20D2","nvdash":"\u22AC","nvDash":"\u22AD","nVdash":"\u22AE","nVDash":"\u22AF","nvge":"\u2265\u20D2","nvgt":">\u20D2","nvHarr":"\u2904","nvinfin":"\u29DE","nvlArr":"\u2902","nvle":"\u2264\u20D2","nvlt":"<\u20D2","nvltrie":"\u22B4\u20D2","nvrArr":"\u2903","nvrtrie":"\u22B5\u20D2","nvsim":"\u223C\u20D2","nwarhk":"\u2923","nwarr":"\u2196","nwArr":"\u21D6","nwarrow":"\u2196","nwnear":"\u2927","Oacute":"\u00D3","oacute":"\u00F3","oast":"\u229B","Ocirc":"\u00D4","ocirc":"\u00F4","ocir":"\u229A","Ocy":"\u041E","ocy":"\u043E","odash":"\u229D","Odblac":"\u0150","odblac":"\u0151","odiv":"\u2A38","odot":"\u2299","odsold":"\u29BC","OElig":"\u0152","oelig":"\u0153","ofcir":"\u29BF","Ofr":"\uD835\uDD12","ofr":"\uD835\uDD2C","ogon":"\u02DB","Ograve":"\u00D2","ograve":"\u00F2","ogt":"\u29C1","ohbar":"\u29B5","ohm":"\u03A9","oint":"\u222E","olarr":"\u21BA","olcir":"\u29BE","olcross":"\u29BB","oline":"\u203E","olt":"\u29C0","Omacr":"\u014C","omacr":"\u014D","Omega":"\u03A9","omega":"\u03C9","Omicron":"\u039F","omicron":"\u03BF","omid":"\u29B6","ominus":"\u2296","Oopf":"\uD835\uDD46","oopf":"\uD835\uDD60","opar":"\u29B7","OpenCurlyDoubleQuote":"\u201C","OpenCurlyQuote":"\u2018","operp":"\u29B9","oplus":"\u2295","orarr":"\u21BB","Or":"\u2A54","or":"\u2228","ord":"\u2A5D","order":"\u2134","orderof":"\u2134","ordf":"\u00AA","ordm":"\u00BA","origof":"\u22B6","oror":"\u2A56","orslope":"\u2A57","orv":"\u2A5B","oS":"\u24C8","Oscr":"\uD835\uDCAA","oscr":"\u2134","Oslash":"\u00D8","oslash":"\u00F8","osol":"\u2298","Otilde":"\u00D5","otilde":"\u00F5","otimesas":"\u2A36","Otimes":"\u2A37","otimes":"\u2297","Ouml":"\u00D6","ouml":"\u00F6","ovbar":"\u233D","OverBar":"\u203E","OverBrace":"\u23DE","OverBracket":"\u23B4","OverParenthesis":"\u23DC","para":"\u00B6","parallel":"\u2225","par":"\u2225","parsim":"\u2AF3","parsl":"\u2AFD","part":"\u2202","PartialD":"\u2202","Pcy":"\u041F","pcy":"\u043F","percnt":"%","period":".","permil":"\u2030","perp":"\u22A5","pertenk":"\u2031","Pfr":"\uD835\uDD13","pfr":"\uD835\uDD2D","Phi":"\u03A6","phi":"\u03C6","phiv":"\u03D5","phmmat":"\u2133","phone":"\u260E","Pi":"\u03A0","pi":"\u03C0","pitchfork":"\u22D4","piv":"\u03D6","planck":"\u210F","planckh":"\u210E","plankv":"\u210F","plusacir":"\u2A23","plusb":"\u229E","pluscir":"\u2A22","plus":"+","plusdo":"\u2214","plusdu":"\u2A25","pluse":"\u2A72","PlusMinus":"\u00B1","plusmn":"\u00B1","plussim":"\u2A26","plustwo":"\u2A27","pm":"\u00B1","Poincareplane":"\u210C","pointint":"\u2A15","popf":"\uD835\uDD61","Popf":"\u2119","pound":"\u00A3","prap":"\u2AB7","Pr":"\u2ABB","pr":"\u227A","prcue":"\u227C","precapprox":"\u2AB7","prec":"\u227A","preccurlyeq":"\u227C","Precedes":"\u227A","PrecedesEqual":"\u2AAF","PrecedesSlantEqual":"\u227C","PrecedesTilde":"\u227E","preceq":"\u2AAF","precnapprox":"\u2AB9","precneqq":"\u2AB5","precnsim":"\u22E8","pre":"\u2AAF","prE":"\u2AB3","precsim":"\u227E","prime":"\u2032","Prime":"\u2033","primes":"\u2119","prnap":"\u2AB9","prnE":"\u2AB5","prnsim":"\u22E8","prod":"\u220F","Product":"\u220F","profalar":"\u232E","profline":"\u2312","profsurf":"\u2313","prop":"\u221D","Proportional":"\u221D","Proportion":"\u2237","propto":"\u221D","prsim":"\u227E","prurel":"\u22B0","Pscr":"\uD835\uDCAB","pscr":"\uD835\uDCC5","Psi":"\u03A8","psi":"\u03C8","puncsp":"\u2008","Qfr":"\uD835\uDD14","qfr":"\uD835\uDD2E","qint":"\u2A0C","qopf":"\uD835\uDD62","Qopf":"\u211A","qprime":"\u2057","Qscr":"\uD835\uDCAC","qscr":"\uD835\uDCC6","quaternions":"\u210D","quatint":"\u2A16","quest":"?","questeq":"\u225F","quot":"\"","QUOT":"\"","rAarr":"\u21DB","race":"\u223D\u0331","Racute":"\u0154","racute":"\u0155","radic":"\u221A","raemptyv":"\u29B3","rang":"\u27E9","Rang":"\u27EB","rangd":"\u2992","range":"\u29A5","rangle":"\u27E9","raquo":"\u00BB","rarrap":"\u2975","rarrb":"\u21E5","rarrbfs":"\u2920","rarrc":"\u2933","rarr":"\u2192","Rarr":"\u21A0","rArr":"\u21D2","rarrfs":"\u291E","rarrhk":"\u21AA","rarrlp":"\u21AC","rarrpl":"\u2945","rarrsim":"\u2974","Rarrtl":"\u2916","rarrtl":"\u21A3","rarrw":"\u219D","ratail":"\u291A","rAtail":"\u291C","ratio":"\u2236","rationals":"\u211A","rbarr":"\u290D","rBarr":"\u290F","RBarr":"\u2910","rbbrk":"\u2773","rbrace":"}","rbrack":"]","rbrke":"\u298C","rbrksld":"\u298E","rbrkslu":"\u2990","Rcaron":"\u0158","rcaron":"\u0159","Rcedil":"\u0156","rcedil":"\u0157","rceil":"\u2309","rcub":"}","Rcy":"\u0420","rcy":"\u0440","rdca":"\u2937","rdldhar":"\u2969","rdquo":"\u201D","rdquor":"\u201D","rdsh":"\u21B3","real":"\u211C","realine":"\u211B","realpart":"\u211C","reals":"\u211D","Re":"\u211C","rect":"\u25AD","reg":"\u00AE","REG":"\u00AE","ReverseElement":"\u220B","ReverseEquilibrium":"\u21CB","ReverseUpEquilibrium":"\u296F","rfisht":"\u297D","rfloor":"\u230B","rfr":"\uD835\uDD2F","Rfr":"\u211C","rHar":"\u2964","rhard":"\u21C1","rharu":"\u21C0","rharul":"\u296C","Rho":"\u03A1","rho":"\u03C1","rhov":"\u03F1","RightAngleBracket":"\u27E9","RightArrowBar":"\u21E5","rightarrow":"\u2192","RightArrow":"\u2192","Rightarrow":"\u21D2","RightArrowLeftArrow":"\u21C4","rightarrowtail":"\u21A3","RightCeiling":"\u2309","RightDoubleBracket":"\u27E7","RightDownTeeVector":"\u295D","RightDownVectorBar":"\u2955","RightDownVector":"\u21C2","RightFloor":"\u230B","rightharpoondown":"\u21C1","rightharpoonup":"\u21C0","rightleftarrows":"\u21C4","rightleftharpoons":"\u21CC","rightrightarrows":"\u21C9","rightsquigarrow":"\u219D","RightTeeArrow":"\u21A6","RightTee":"\u22A2","RightTeeVector":"\u295B","rightthreetimes":"\u22CC","RightTriangleBar":"\u29D0","RightTriangle":"\u22B3","RightTriangleEqual":"\u22B5","RightUpDownVector":"\u294F","RightUpTeeVector":"\u295C","RightUpVectorBar":"\u2954","RightUpVector":"\u21BE","RightVectorBar":"\u2953","RightVector":"\u21C0","ring":"\u02DA","risingdotseq":"\u2253","rlarr":"\u21C4","rlhar":"\u21CC","rlm":"\u200F","rmoustache":"\u23B1","rmoust":"\u23B1","rnmid":"\u2AEE","roang":"\u27ED","roarr":"\u21FE","robrk":"\u27E7","ropar":"\u2986","ropf":"\uD835\uDD63","Ropf":"\u211D","roplus":"\u2A2E","rotimes":"\u2A35","RoundImplies":"\u2970","rpar":")","rpargt":"\u2994","rppolint":"\u2A12","rrarr":"\u21C9","Rrightarrow":"\u21DB","rsaquo":"\u203A","rscr":"\uD835\uDCC7","Rscr":"\u211B","rsh":"\u21B1","Rsh":"\u21B1","rsqb":"]","rsquo":"\u2019","rsquor":"\u2019","rthree":"\u22CC","rtimes":"\u22CA","rtri":"\u25B9","rtrie":"\u22B5","rtrif":"\u25B8","rtriltri":"\u29CE","RuleDelayed":"\u29F4","ruluhar":"\u2968","rx":"\u211E","Sacute":"\u015A","sacute":"\u015B","sbquo":"\u201A","scap":"\u2AB8","Scaron":"\u0160","scaron":"\u0161","Sc":"\u2ABC","sc":"\u227B","sccue":"\u227D","sce":"\u2AB0","scE":"\u2AB4","Scedil":"\u015E","scedil":"\u015F","Scirc":"\u015C","scirc":"\u015D","scnap":"\u2ABA","scnE":"\u2AB6","scnsim":"\u22E9","scpolint":"\u2A13","scsim":"\u227F","Scy":"\u0421","scy":"\u0441","sdotb":"\u22A1","sdot":"\u22C5","sdote":"\u2A66","searhk":"\u2925","searr":"\u2198","seArr":"\u21D8","searrow":"\u2198","sect":"\u00A7","semi":";","seswar":"\u2929","setminus":"\u2216","setmn":"\u2216","sext":"\u2736","Sfr":"\uD835\uDD16","sfr":"\uD835\uDD30","sfrown":"\u2322","sharp":"\u266F","SHCHcy":"\u0429","shchcy":"\u0449","SHcy":"\u0428","shcy":"\u0448","ShortDownArrow":"\u2193","ShortLeftArrow":"\u2190","shortmid":"\u2223","shortparallel":"\u2225","ShortRightArrow":"\u2192","ShortUpArrow":"\u2191","shy":"\u00AD","Sigma":"\u03A3","sigma":"\u03C3","sigmaf":"\u03C2","sigmav":"\u03C2","sim":"\u223C","simdot":"\u2A6A","sime":"\u2243","simeq":"\u2243","simg":"\u2A9E","simgE":"\u2AA0","siml":"\u2A9D","simlE":"\u2A9F","simne":"\u2246","simplus":"\u2A24","simrarr":"\u2972","slarr":"\u2190","SmallCircle":"\u2218","smallsetminus":"\u2216","smashp":"\u2A33","smeparsl":"\u29E4","smid":"\u2223","smile":"\u2323","smt":"\u2AAA","smte":"\u2AAC","smtes":"\u2AAC\uFE00","SOFTcy":"\u042C","softcy":"\u044C","solbar":"\u233F","solb":"\u29C4","sol":"/","Sopf":"\uD835\uDD4A","sopf":"\uD835\uDD64","spades":"\u2660","spadesuit":"\u2660","spar":"\u2225","sqcap":"\u2293","sqcaps":"\u2293\uFE00","sqcup":"\u2294","sqcups":"\u2294\uFE00","Sqrt":"\u221A","sqsub":"\u228F","sqsube":"\u2291","sqsubset":"\u228F","sqsubseteq":"\u2291","sqsup":"\u2290","sqsupe":"\u2292","sqsupset":"\u2290","sqsupseteq":"\u2292","square":"\u25A1","Square":"\u25A1","SquareIntersection":"\u2293","SquareSubset":"\u228F","SquareSubsetEqual":"\u2291","SquareSuperset":"\u2290","SquareSupersetEqual":"\u2292","SquareUnion":"\u2294","squarf":"\u25AA","squ":"\u25A1","squf":"\u25AA","srarr":"\u2192","Sscr":"\uD835\uDCAE","sscr":"\uD835\uDCC8","ssetmn":"\u2216","ssmile":"\u2323","sstarf":"\u22C6","Star":"\u22C6","star":"\u2606","starf":"\u2605","straightepsilon":"\u03F5","straightphi":"\u03D5","strns":"\u00AF","sub":"\u2282","Sub":"\u22D0","subdot":"\u2ABD","subE":"\u2AC5","sube":"\u2286","subedot":"\u2AC3","submult":"\u2AC1","subnE":"\u2ACB","subne":"\u228A","subplus":"\u2ABF","subrarr":"\u2979","subset":"\u2282","Subset":"\u22D0","subseteq":"\u2286","subseteqq":"\u2AC5","SubsetEqual":"\u2286","subsetneq":"\u228A","subsetneqq":"\u2ACB","subsim":"\u2AC7","subsub":"\u2AD5","subsup":"\u2AD3","succapprox":"\u2AB8","succ":"\u227B","succcurlyeq":"\u227D","Succeeds":"\u227B","SucceedsEqual":"\u2AB0","SucceedsSlantEqual":"\u227D","SucceedsTilde":"\u227F","succeq":"\u2AB0","succnapprox":"\u2ABA","succneqq":"\u2AB6","succnsim":"\u22E9","succsim":"\u227F","SuchThat":"\u220B","sum":"\u2211","Sum":"\u2211","sung":"\u266A","sup1":"\u00B9","sup2":"\u00B2","sup3":"\u00B3","sup":"\u2283","Sup":"\u22D1","supdot":"\u2ABE","supdsub":"\u2AD8","supE":"\u2AC6","supe":"\u2287","supedot":"\u2AC4","Superset":"\u2283","SupersetEqual":"\u2287","suphsol":"\u27C9","suphsub":"\u2AD7","suplarr":"\u297B","supmult":"\u2AC2","supnE":"\u2ACC","supne":"\u228B","supplus":"\u2AC0","supset":"\u2283","Supset":"\u22D1","supseteq":"\u2287","supseteqq":"\u2AC6","supsetneq":"\u228B","supsetneqq":"\u2ACC","supsim":"\u2AC8","supsub":"\u2AD4","supsup":"\u2AD6","swarhk":"\u2926","swarr":"\u2199","swArr":"\u21D9","swarrow":"\u2199","swnwar":"\u292A","szlig":"\u00DF","Tab":"\t","target":"\u2316","Tau":"\u03A4","tau":"\u03C4","tbrk":"\u23B4","Tcaron":"\u0164","tcaron":"\u0165","Tcedil":"\u0162","tcedil":"\u0163","Tcy":"\u0422","tcy":"\u0442","tdot":"\u20DB","telrec":"\u2315","Tfr":"\uD835\uDD17","tfr":"\uD835\uDD31","there4":"\u2234","therefore":"\u2234","Therefore":"\u2234","Theta":"\u0398","theta":"\u03B8","thetasym":"\u03D1","thetav":"\u03D1","thickapprox":"\u2248","thicksim":"\u223C","ThickSpace":"\u205F\u200A","ThinSpace":"\u2009","thinsp":"\u2009","thkap":"\u2248","thksim":"\u223C","THORN":"\u00DE","thorn":"\u00FE","tilde":"\u02DC","Tilde":"\u223C","TildeEqual":"\u2243","TildeFullEqual":"\u2245","TildeTilde":"\u2248","timesbar":"\u2A31","timesb":"\u22A0","times":"\u00D7","timesd":"\u2A30","tint":"\u222D","toea":"\u2928","topbot":"\u2336","topcir":"\u2AF1","top":"\u22A4","Topf":"\uD835\uDD4B","topf":"\uD835\uDD65","topfork":"\u2ADA","tosa":"\u2929","tprime":"\u2034","trade":"\u2122","TRADE":"\u2122","triangle":"\u25B5","triangledown":"\u25BF","triangleleft":"\u25C3","trianglelefteq":"\u22B4","triangleq":"\u225C","triangleright":"\u25B9","trianglerighteq":"\u22B5","tridot":"\u25EC","trie":"\u225C","triminus":"\u2A3A","TripleDot":"\u20DB","triplus":"\u2A39","trisb":"\u29CD","tritime":"\u2A3B","trpezium":"\u23E2","Tscr":"\uD835\uDCAF","tscr":"\uD835\uDCC9","TScy":"\u0426","tscy":"\u0446","TSHcy":"\u040B","tshcy":"\u045B","Tstrok":"\u0166","tstrok":"\u0167","twixt":"\u226C","twoheadleftarrow":"\u219E","twoheadrightarrow":"\u21A0","Uacute":"\u00DA","uacute":"\u00FA","uarr":"\u2191","Uarr":"\u219F","uArr":"\u21D1","Uarrocir":"\u2949","Ubrcy":"\u040E","ubrcy":"\u045E","Ubreve":"\u016C","ubreve":"\u016D","Ucirc":"\u00DB","ucirc":"\u00FB","Ucy":"\u0423","ucy":"\u0443","udarr":"\u21C5","Udblac":"\u0170","udblac":"\u0171","udhar":"\u296E","ufisht":"\u297E","Ufr":"\uD835\uDD18","ufr":"\uD835\uDD32","Ugrave":"\u00D9","ugrave":"\u00F9","uHar":"\u2963","uharl":"\u21BF","uharr":"\u21BE","uhblk":"\u2580","ulcorn":"\u231C","ulcorner":"\u231C","ulcrop":"\u230F","ultri":"\u25F8","Umacr":"\u016A","umacr":"\u016B","uml":"\u00A8","UnderBar":"_","UnderBrace":"\u23DF","UnderBracket":"\u23B5","UnderParenthesis":"\u23DD","Union":"\u22C3","UnionPlus":"\u228E","Uogon":"\u0172","uogon":"\u0173","Uopf":"\uD835\uDD4C","uopf":"\uD835\uDD66","UpArrowBar":"\u2912","uparrow":"\u2191","UpArrow":"\u2191","Uparrow":"\u21D1","UpArrowDownArrow":"\u21C5","updownarrow":"\u2195","UpDownArrow":"\u2195","Updownarrow":"\u21D5","UpEquilibrium":"\u296E","upharpoonleft":"\u21BF","upharpoonright":"\u21BE","uplus":"\u228E","UpperLeftArrow":"\u2196","UpperRightArrow":"\u2197","upsi":"\u03C5","Upsi":"\u03D2","upsih":"\u03D2","Upsilon":"\u03A5","upsilon":"\u03C5","UpTeeArrow":"\u21A5","UpTee":"\u22A5","upuparrows":"\u21C8","urcorn":"\u231D","urcorner":"\u231D","urcrop":"\u230E","Uring":"\u016E","uring":"\u016F","urtri":"\u25F9","Uscr":"\uD835\uDCB0","uscr":"\uD835\uDCCA","utdot":"\u22F0","Utilde":"\u0168","utilde":"\u0169","utri":"\u25B5","utrif":"\u25B4","uuarr":"\u21C8","Uuml":"\u00DC","uuml":"\u00FC","uwangle":"\u29A7","vangrt":"\u299C","varepsilon":"\u03F5","varkappa":"\u03F0","varnothing":"\u2205","varphi":"\u03D5","varpi":"\u03D6","varpropto":"\u221D","varr":"\u2195","vArr":"\u21D5","varrho":"\u03F1","varsigma":"\u03C2","varsubsetneq":"\u228A\uFE00","varsubsetneqq":"\u2ACB\uFE00","varsupsetneq":"\u228B\uFE00","varsupsetneqq":"\u2ACC\uFE00","vartheta":"\u03D1","vartriangleleft":"\u22B2","vartriangleright":"\u22B3","vBar":"\u2AE8","Vbar":"\u2AEB","vBarv":"\u2AE9","Vcy":"\u0412","vcy":"\u0432","vdash":"\u22A2","vDash":"\u22A8","Vdash":"\u22A9","VDash":"\u22AB","Vdashl":"\u2AE6","veebar":"\u22BB","vee":"\u2228","Vee":"\u22C1","veeeq":"\u225A","vellip":"\u22EE","verbar":"|","Verbar":"\u2016","vert":"|","Vert":"\u2016","VerticalBar":"\u2223","VerticalLine":"|","VerticalSeparator":"\u2758","VerticalTilde":"\u2240","VeryThinSpace":"\u200A","Vfr":"\uD835\uDD19","vfr":"\uD835\uDD33","vltri":"\u22B2","vnsub":"\u2282\u20D2","vnsup":"\u2283\u20D2","Vopf":"\uD835\uDD4D","vopf":"\uD835\uDD67","vprop":"\u221D","vrtri":"\u22B3","Vscr":"\uD835\uDCB1","vscr":"\uD835\uDCCB","vsubnE":"\u2ACB\uFE00","vsubne":"\u228A\uFE00","vsupnE":"\u2ACC\uFE00","vsupne":"\u228B\uFE00","Vvdash":"\u22AA","vzigzag":"\u299A","Wcirc":"\u0174","wcirc":"\u0175","wedbar":"\u2A5F","wedge":"\u2227","Wedge":"\u22C0","wedgeq":"\u2259","weierp":"\u2118","Wfr":"\uD835\uDD1A","wfr":"\uD835\uDD34","Wopf":"\uD835\uDD4E","wopf":"\uD835\uDD68","wp":"\u2118","wr":"\u2240","wreath":"\u2240","Wscr":"\uD835\uDCB2","wscr":"\uD835\uDCCC","xcap":"\u22C2","xcirc":"\u25EF","xcup":"\u22C3","xdtri":"\u25BD","Xfr":"\uD835\uDD1B","xfr":"\uD835\uDD35","xharr":"\u27F7","xhArr":"\u27FA","Xi":"\u039E","xi":"\u03BE","xlarr":"\u27F5","xlArr":"\u27F8","xmap":"\u27FC","xnis":"\u22FB","xodot":"\u2A00","Xopf":"\uD835\uDD4F","xopf":"\uD835\uDD69","xoplus":"\u2A01","xotime":"\u2A02","xrarr":"\u27F6","xrArr":"\u27F9","Xscr":"\uD835\uDCB3","xscr":"\uD835\uDCCD","xsqcup":"\u2A06","xuplus":"\u2A04","xutri":"\u25B3","xvee":"\u22C1","xwedge":"\u22C0","Yacute":"\u00DD","yacute":"\u00FD","YAcy":"\u042F","yacy":"\u044F","Ycirc":"\u0176","ycirc":"\u0177","Ycy":"\u042B","ycy":"\u044B","yen":"\u00A5","Yfr":"\uD835\uDD1C","yfr":"\uD835\uDD36","YIcy":"\u0407","yicy":"\u0457","Yopf":"\uD835\uDD50","yopf":"\uD835\uDD6A","Yscr":"\uD835\uDCB4","yscr":"\uD835\uDCCE","YUcy":"\u042E","yucy":"\u044E","yuml":"\u00FF","Yuml":"\u0178","Zacute":"\u0179","zacute":"\u017A","Zcaron":"\u017D","zcaron":"\u017E","Zcy":"\u0417","zcy":"\u0437","Zdot":"\u017B","zdot":"\u017C","zeetrf":"\u2128","ZeroWidthSpace":"\u200B","Zeta":"\u0396","zeta":"\u03B6","zfr":"\uD835\uDD37","Zfr":"\u2128","ZHcy":"\u0416","zhcy":"\u0436","zigrarr":"\u21DD","zopf":"\uD835\uDD6B","Zopf":"\u2124","Zscr":"\uD835\uDCB5","zscr":"\uD835\uDCCF","zwj":"\u200D","zwnj":"\u200C"}; -},{}],"erYB":[function(require,module,exports) { -module.exports = {"Aacute":"\u00C1","aacute":"\u00E1","Acirc":"\u00C2","acirc":"\u00E2","acute":"\u00B4","AElig":"\u00C6","aelig":"\u00E6","Agrave":"\u00C0","agrave":"\u00E0","amp":"&","AMP":"&","Aring":"\u00C5","aring":"\u00E5","Atilde":"\u00C3","atilde":"\u00E3","Auml":"\u00C4","auml":"\u00E4","brvbar":"\u00A6","Ccedil":"\u00C7","ccedil":"\u00E7","cedil":"\u00B8","cent":"\u00A2","copy":"\u00A9","COPY":"\u00A9","curren":"\u00A4","deg":"\u00B0","divide":"\u00F7","Eacute":"\u00C9","eacute":"\u00E9","Ecirc":"\u00CA","ecirc":"\u00EA","Egrave":"\u00C8","egrave":"\u00E8","ETH":"\u00D0","eth":"\u00F0","Euml":"\u00CB","euml":"\u00EB","frac12":"\u00BD","frac14":"\u00BC","frac34":"\u00BE","gt":">","GT":">","Iacute":"\u00CD","iacute":"\u00ED","Icirc":"\u00CE","icirc":"\u00EE","iexcl":"\u00A1","Igrave":"\u00CC","igrave":"\u00EC","iquest":"\u00BF","Iuml":"\u00CF","iuml":"\u00EF","laquo":"\u00AB","lt":"<","LT":"<","macr":"\u00AF","micro":"\u00B5","middot":"\u00B7","nbsp":"\u00A0","not":"\u00AC","Ntilde":"\u00D1","ntilde":"\u00F1","Oacute":"\u00D3","oacute":"\u00F3","Ocirc":"\u00D4","ocirc":"\u00F4","Ograve":"\u00D2","ograve":"\u00F2","ordf":"\u00AA","ordm":"\u00BA","Oslash":"\u00D8","oslash":"\u00F8","Otilde":"\u00D5","otilde":"\u00F5","Ouml":"\u00D6","ouml":"\u00F6","para":"\u00B6","plusmn":"\u00B1","pound":"\u00A3","quot":"\"","QUOT":"\"","raquo":"\u00BB","reg":"\u00AE","REG":"\u00AE","sect":"\u00A7","shy":"\u00AD","sup1":"\u00B9","sup2":"\u00B2","sup3":"\u00B3","szlig":"\u00DF","THORN":"\u00DE","thorn":"\u00FE","times":"\u00D7","Uacute":"\u00DA","uacute":"\u00FA","Ucirc":"\u00DB","ucirc":"\u00FB","Ugrave":"\u00D9","ugrave":"\u00F9","uml":"\u00A8","Uuml":"\u00DC","uuml":"\u00FC","Yacute":"\u00DD","yacute":"\u00FD","yen":"\u00A5","yuml":"\u00FF"}; -},{}],"XK3y":[function(require,module,exports) { -module.exports = {"amp":"&","apos":"'","gt":">","lt":"<","quot":"\""} -; -},{}],"I1ZB":[function(require,module,exports) { -module.exports = Tokenizer; - -var decodeCodePoint = require("entities/lib/decode_codepoint.js"); -var entityMap = require("entities/maps/entities.json"); -var legacyMap = require("entities/maps/legacy.json"); -var xmlMap = require("entities/maps/xml.json"); - -var i = 0; - -var TEXT = i++; -var BEFORE_TAG_NAME = i++; //after < -var IN_TAG_NAME = i++; -var IN_SELF_CLOSING_TAG = i++; -var BEFORE_CLOSING_TAG_NAME = i++; -var IN_CLOSING_TAG_NAME = i++; -var AFTER_CLOSING_TAG_NAME = i++; - -//attributes -var BEFORE_ATTRIBUTE_NAME = i++; -var IN_ATTRIBUTE_NAME = i++; -var AFTER_ATTRIBUTE_NAME = i++; -var BEFORE_ATTRIBUTE_VALUE = i++; -var IN_ATTRIBUTE_VALUE_DQ = i++; // " -var IN_ATTRIBUTE_VALUE_SQ = i++; // ' -var IN_ATTRIBUTE_VALUE_NQ = i++; - -//declarations -var BEFORE_DECLARATION = i++; // ! -var IN_DECLARATION = i++; - -//processing instructions -var IN_PROCESSING_INSTRUCTION = i++; // ? - -//comments -var BEFORE_COMMENT = i++; -var IN_COMMENT = i++; -var AFTER_COMMENT_1 = i++; -var AFTER_COMMENT_2 = i++; - -//cdata -var BEFORE_CDATA_1 = i++; // [ -var BEFORE_CDATA_2 = i++; // C -var BEFORE_CDATA_3 = i++; // D -var BEFORE_CDATA_4 = i++; // A -var BEFORE_CDATA_5 = i++; // T -var BEFORE_CDATA_6 = i++; // A -var IN_CDATA = i++; // [ -var AFTER_CDATA_1 = i++; // ] -var AFTER_CDATA_2 = i++; // ] - -//special tags -var BEFORE_SPECIAL = i++; //S -var BEFORE_SPECIAL_END = i++; //S - -var BEFORE_SCRIPT_1 = i++; //C -var BEFORE_SCRIPT_2 = i++; //R -var BEFORE_SCRIPT_3 = i++; //I -var BEFORE_SCRIPT_4 = i++; //P -var BEFORE_SCRIPT_5 = i++; //T -var AFTER_SCRIPT_1 = i++; //C -var AFTER_SCRIPT_2 = i++; //R -var AFTER_SCRIPT_3 = i++; //I -var AFTER_SCRIPT_4 = i++; //P -var AFTER_SCRIPT_5 = i++; //T - -var BEFORE_STYLE_1 = i++; //T -var BEFORE_STYLE_2 = i++; //Y -var BEFORE_STYLE_3 = i++; //L -var BEFORE_STYLE_4 = i++; //E -var AFTER_STYLE_1 = i++; //T -var AFTER_STYLE_2 = i++; //Y -var AFTER_STYLE_3 = i++; //L -var AFTER_STYLE_4 = i++; //E - -var BEFORE_ENTITY = i++; //& -var BEFORE_NUMERIC_ENTITY = i++; //# -var IN_NAMED_ENTITY = i++; -var IN_NUMERIC_ENTITY = i++; -var IN_HEX_ENTITY = i++; //X - -var j = 0; - -var SPECIAL_NONE = j++; -var SPECIAL_SCRIPT = j++; -var SPECIAL_STYLE = j++; - -function whitespace(c) { - return c === " " || c === "\n" || c === "\t" || c === "\f" || c === "\r"; -} - -function ifElseState(upper, SUCCESS, FAILURE) { - var lower = upper.toLowerCase(); - - if (upper === lower) { - return function(c) { - if (c === lower) { - this._state = SUCCESS; - } else { - this._state = FAILURE; - this._index--; - } - }; - } else { - return function(c) { - if (c === lower || c === upper) { - this._state = SUCCESS; - } else { - this._state = FAILURE; - this._index--; - } - }; - } -} - -function consumeSpecialNameChar(upper, NEXT_STATE) { - var lower = upper.toLowerCase(); - - return function(c) { - if (c === lower || c === upper) { - this._state = NEXT_STATE; - } else { - this._state = IN_TAG_NAME; - this._index--; //consume the token again - } - }; -} - -function Tokenizer(options, cbs) { - this._state = TEXT; - this._buffer = ""; - this._sectionStart = 0; - this._index = 0; - this._bufferOffset = 0; //chars removed from _buffer - this._baseState = TEXT; - this._special = SPECIAL_NONE; - this._cbs = cbs; - this._running = true; - this._ended = false; - this._xmlMode = !!(options && options.xmlMode); - this._decodeEntities = !!(options && options.decodeEntities); -} - -Tokenizer.prototype._stateText = function(c) { - if (c === "<") { - if (this._index > this._sectionStart) { - this._cbs.ontext(this._getSection()); - } - this._state = BEFORE_TAG_NAME; - this._sectionStart = this._index; - } else if ( - this._decodeEntities && - this._special === SPECIAL_NONE && - c === "&" - ) { - if (this._index > this._sectionStart) { - this._cbs.ontext(this._getSection()); - } - this._baseState = TEXT; - this._state = BEFORE_ENTITY; - this._sectionStart = this._index; - } -}; - -Tokenizer.prototype._stateBeforeTagName = function(c) { - if (c === "/") { - this._state = BEFORE_CLOSING_TAG_NAME; - } else if (c === "<") { - this._cbs.ontext(this._getSection()); - this._sectionStart = this._index; - } else if (c === ">" || this._special !== SPECIAL_NONE || whitespace(c)) { - this._state = TEXT; - } else if (c === "!") { - this._state = BEFORE_DECLARATION; - this._sectionStart = this._index + 1; - } else if (c === "?") { - this._state = IN_PROCESSING_INSTRUCTION; - this._sectionStart = this._index + 1; - } else { - this._state = - !this._xmlMode && (c === "s" || c === "S") - ? BEFORE_SPECIAL - : IN_TAG_NAME; - this._sectionStart = this._index; - } -}; - -Tokenizer.prototype._stateInTagName = function(c) { - if (c === "/" || c === ">" || whitespace(c)) { - this._emitToken("onopentagname"); - this._state = BEFORE_ATTRIBUTE_NAME; - this._index--; - } -}; - -Tokenizer.prototype._stateBeforeCloseingTagName = function(c) { - if (whitespace(c)); - else if (c === ">") { - this._state = TEXT; - } else if (this._special !== SPECIAL_NONE) { - if (c === "s" || c === "S") { - this._state = BEFORE_SPECIAL_END; - } else { - this._state = TEXT; - this._index--; - } - } else { - this._state = IN_CLOSING_TAG_NAME; - this._sectionStart = this._index; - } -}; - -Tokenizer.prototype._stateInCloseingTagName = function(c) { - if (c === ">" || whitespace(c)) { - this._emitToken("onclosetag"); - this._state = AFTER_CLOSING_TAG_NAME; - this._index--; - } -}; - -Tokenizer.prototype._stateAfterCloseingTagName = function(c) { - //skip everything until ">" - if (c === ">") { - this._state = TEXT; - this._sectionStart = this._index + 1; - } -}; - -Tokenizer.prototype._stateBeforeAttributeName = function(c) { - if (c === ">") { - this._cbs.onopentagend(); - this._state = TEXT; - this._sectionStart = this._index + 1; - } else if (c === "/") { - this._state = IN_SELF_CLOSING_TAG; - } else if (!whitespace(c)) { - this._state = IN_ATTRIBUTE_NAME; - this._sectionStart = this._index; - } -}; - -Tokenizer.prototype._stateInSelfClosingTag = function(c) { - if (c === ">") { - this._cbs.onselfclosingtag(); - this._state = TEXT; - this._sectionStart = this._index + 1; - } else if (!whitespace(c)) { - this._state = BEFORE_ATTRIBUTE_NAME; - this._index--; - } -}; - -Tokenizer.prototype._stateInAttributeName = function(c) { - if (c === "=" || c === "/" || c === ">" || whitespace(c)) { - this._cbs.onattribname(this._getSection()); - this._sectionStart = -1; - this._state = AFTER_ATTRIBUTE_NAME; - this._index--; - } -}; - -Tokenizer.prototype._stateAfterAttributeName = function(c) { - if (c === "=") { - this._state = BEFORE_ATTRIBUTE_VALUE; - } else if (c === "/" || c === ">") { - this._cbs.onattribend(); - this._state = BEFORE_ATTRIBUTE_NAME; - this._index--; - } else if (!whitespace(c)) { - this._cbs.onattribend(); - this._state = IN_ATTRIBUTE_NAME; - this._sectionStart = this._index; - } -}; - -Tokenizer.prototype._stateBeforeAttributeValue = function(c) { - if (c === '"') { - this._state = IN_ATTRIBUTE_VALUE_DQ; - this._sectionStart = this._index + 1; - } else if (c === "'") { - this._state = IN_ATTRIBUTE_VALUE_SQ; - this._sectionStart = this._index + 1; - } else if (!whitespace(c)) { - this._state = IN_ATTRIBUTE_VALUE_NQ; - this._sectionStart = this._index; - this._index--; //reconsume token - } -}; - -Tokenizer.prototype._stateInAttributeValueDoubleQuotes = function(c) { - if (c === '"') { - this._emitToken("onattribdata"); - this._cbs.onattribend(); - this._state = BEFORE_ATTRIBUTE_NAME; - } else if (this._decodeEntities && c === "&") { - this._emitToken("onattribdata"); - this._baseState = this._state; - this._state = BEFORE_ENTITY; - this._sectionStart = this._index; - } -}; - -Tokenizer.prototype._stateInAttributeValueSingleQuotes = function(c) { - if (c === "'") { - this._emitToken("onattribdata"); - this._cbs.onattribend(); - this._state = BEFORE_ATTRIBUTE_NAME; - } else if (this._decodeEntities && c === "&") { - this._emitToken("onattribdata"); - this._baseState = this._state; - this._state = BEFORE_ENTITY; - this._sectionStart = this._index; - } -}; - -Tokenizer.prototype._stateInAttributeValueNoQuotes = function(c) { - if (whitespace(c) || c === ">") { - this._emitToken("onattribdata"); - this._cbs.onattribend(); - this._state = BEFORE_ATTRIBUTE_NAME; - this._index--; - } else if (this._decodeEntities && c === "&") { - this._emitToken("onattribdata"); - this._baseState = this._state; - this._state = BEFORE_ENTITY; - this._sectionStart = this._index; - } -}; - -Tokenizer.prototype._stateBeforeDeclaration = function(c) { - this._state = - c === "[" - ? BEFORE_CDATA_1 - : c === "-" - ? BEFORE_COMMENT - : IN_DECLARATION; -}; - -Tokenizer.prototype._stateInDeclaration = function(c) { - if (c === ">") { - this._cbs.ondeclaration(this._getSection()); - this._state = TEXT; - this._sectionStart = this._index + 1; - } -}; - -Tokenizer.prototype._stateInProcessingInstruction = function(c) { - if (c === ">") { - this._cbs.onprocessinginstruction(this._getSection()); - this._state = TEXT; - this._sectionStart = this._index + 1; - } -}; - -Tokenizer.prototype._stateBeforeComment = function(c) { - if (c === "-") { - this._state = IN_COMMENT; - this._sectionStart = this._index + 1; - } else { - this._state = IN_DECLARATION; - } -}; - -Tokenizer.prototype._stateInComment = function(c) { - if (c === "-") this._state = AFTER_COMMENT_1; -}; - -Tokenizer.prototype._stateAfterComment1 = function(c) { - if (c === "-") { - this._state = AFTER_COMMENT_2; - } else { - this._state = IN_COMMENT; - } -}; - -Tokenizer.prototype._stateAfterComment2 = function(c) { - if (c === ">") { - //remove 2 trailing chars - this._cbs.oncomment( - this._buffer.substring(this._sectionStart, this._index - 2) - ); - this._state = TEXT; - this._sectionStart = this._index + 1; - } else if (c !== "-") { - this._state = IN_COMMENT; - } - // else: stay in AFTER_COMMENT_2 (`--->`) -}; - -Tokenizer.prototype._stateBeforeCdata1 = ifElseState( - "C", - BEFORE_CDATA_2, - IN_DECLARATION -); -Tokenizer.prototype._stateBeforeCdata2 = ifElseState( - "D", - BEFORE_CDATA_3, - IN_DECLARATION -); -Tokenizer.prototype._stateBeforeCdata3 = ifElseState( - "A", - BEFORE_CDATA_4, - IN_DECLARATION -); -Tokenizer.prototype._stateBeforeCdata4 = ifElseState( - "T", - BEFORE_CDATA_5, - IN_DECLARATION -); -Tokenizer.prototype._stateBeforeCdata5 = ifElseState( - "A", - BEFORE_CDATA_6, - IN_DECLARATION -); - -Tokenizer.prototype._stateBeforeCdata6 = function(c) { - if (c === "[") { - this._state = IN_CDATA; - this._sectionStart = this._index + 1; - } else { - this._state = IN_DECLARATION; - this._index--; - } -}; - -Tokenizer.prototype._stateInCdata = function(c) { - if (c === "]") this._state = AFTER_CDATA_1; -}; - -Tokenizer.prototype._stateAfterCdata1 = function(c) { - if (c === "]") this._state = AFTER_CDATA_2; - else this._state = IN_CDATA; -}; - -Tokenizer.prototype._stateAfterCdata2 = function(c) { - if (c === ">") { - //remove 2 trailing chars - this._cbs.oncdata( - this._buffer.substring(this._sectionStart, this._index - 2) - ); - this._state = TEXT; - this._sectionStart = this._index + 1; - } else if (c !== "]") { - this._state = IN_CDATA; - } - //else: stay in AFTER_CDATA_2 (`]]]>`) -}; - -Tokenizer.prototype._stateBeforeSpecial = function(c) { - if (c === "c" || c === "C") { - this._state = BEFORE_SCRIPT_1; - } else if (c === "t" || c === "T") { - this._state = BEFORE_STYLE_1; - } else { - this._state = IN_TAG_NAME; - this._index--; //consume the token again - } -}; - -Tokenizer.prototype._stateBeforeSpecialEnd = function(c) { - if (this._special === SPECIAL_SCRIPT && (c === "c" || c === "C")) { - this._state = AFTER_SCRIPT_1; - } else if (this._special === SPECIAL_STYLE && (c === "t" || c === "T")) { - this._state = AFTER_STYLE_1; - } else this._state = TEXT; -}; - -Tokenizer.prototype._stateBeforeScript1 = consumeSpecialNameChar( - "R", - BEFORE_SCRIPT_2 -); -Tokenizer.prototype._stateBeforeScript2 = consumeSpecialNameChar( - "I", - BEFORE_SCRIPT_3 -); -Tokenizer.prototype._stateBeforeScript3 = consumeSpecialNameChar( - "P", - BEFORE_SCRIPT_4 -); -Tokenizer.prototype._stateBeforeScript4 = consumeSpecialNameChar( - "T", - BEFORE_SCRIPT_5 -); - -Tokenizer.prototype._stateBeforeScript5 = function(c) { - if (c === "/" || c === ">" || whitespace(c)) { - this._special = SPECIAL_SCRIPT; - } - this._state = IN_TAG_NAME; - this._index--; //consume the token again -}; - -Tokenizer.prototype._stateAfterScript1 = ifElseState("R", AFTER_SCRIPT_2, TEXT); -Tokenizer.prototype._stateAfterScript2 = ifElseState("I", AFTER_SCRIPT_3, TEXT); -Tokenizer.prototype._stateAfterScript3 = ifElseState("P", AFTER_SCRIPT_4, TEXT); -Tokenizer.prototype._stateAfterScript4 = ifElseState("T", AFTER_SCRIPT_5, TEXT); - -Tokenizer.prototype._stateAfterScript5 = function(c) { - if (c === ">" || whitespace(c)) { - this._special = SPECIAL_NONE; - this._state = IN_CLOSING_TAG_NAME; - this._sectionStart = this._index - 6; - this._index--; //reconsume the token - } else this._state = TEXT; -}; - -Tokenizer.prototype._stateBeforeStyle1 = consumeSpecialNameChar( - "Y", - BEFORE_STYLE_2 -); -Tokenizer.prototype._stateBeforeStyle2 = consumeSpecialNameChar( - "L", - BEFORE_STYLE_3 -); -Tokenizer.prototype._stateBeforeStyle3 = consumeSpecialNameChar( - "E", - BEFORE_STYLE_4 -); - -Tokenizer.prototype._stateBeforeStyle4 = function(c) { - if (c === "/" || c === ">" || whitespace(c)) { - this._special = SPECIAL_STYLE; - } - this._state = IN_TAG_NAME; - this._index--; //consume the token again -}; - -Tokenizer.prototype._stateAfterStyle1 = ifElseState("Y", AFTER_STYLE_2, TEXT); -Tokenizer.prototype._stateAfterStyle2 = ifElseState("L", AFTER_STYLE_3, TEXT); -Tokenizer.prototype._stateAfterStyle3 = ifElseState("E", AFTER_STYLE_4, TEXT); - -Tokenizer.prototype._stateAfterStyle4 = function(c) { - if (c === ">" || whitespace(c)) { - this._special = SPECIAL_NONE; - this._state = IN_CLOSING_TAG_NAME; - this._sectionStart = this._index - 5; - this._index--; //reconsume the token - } else this._state = TEXT; -}; - -Tokenizer.prototype._stateBeforeEntity = ifElseState( - "#", - BEFORE_NUMERIC_ENTITY, - IN_NAMED_ENTITY -); -Tokenizer.prototype._stateBeforeNumericEntity = ifElseState( - "X", - IN_HEX_ENTITY, - IN_NUMERIC_ENTITY -); - -//for entities terminated with a semicolon -Tokenizer.prototype._parseNamedEntityStrict = function() { - //offset = 1 - if (this._sectionStart + 1 < this._index) { - var entity = this._buffer.substring( - this._sectionStart + 1, - this._index - ), - map = this._xmlMode ? xmlMap : entityMap; - - if (map.hasOwnProperty(entity)) { - this._emitPartial(map[entity]); - this._sectionStart = this._index + 1; - } - } -}; - -//parses legacy entities (without trailing semicolon) -Tokenizer.prototype._parseLegacyEntity = function() { - var start = this._sectionStart + 1, - limit = this._index - start; - - if (limit > 6) limit = 6; //the max length of legacy entities is 6 - - while (limit >= 2) { - //the min length of legacy entities is 2 - var entity = this._buffer.substr(start, limit); - - if (legacyMap.hasOwnProperty(entity)) { - this._emitPartial(legacyMap[entity]); - this._sectionStart += limit + 1; - return; - } else { - limit--; - } - } -}; - -Tokenizer.prototype._stateInNamedEntity = function(c) { - if (c === ";") { - this._parseNamedEntityStrict(); - if (this._sectionStart + 1 < this._index && !this._xmlMode) { - this._parseLegacyEntity(); - } - this._state = this._baseState; - } else if ( - (c < "a" || c > "z") && - (c < "A" || c > "Z") && - (c < "0" || c > "9") - ) { - if (this._xmlMode); - else if (this._sectionStart + 1 === this._index); - else if (this._baseState !== TEXT) { - if (c !== "=") { - this._parseNamedEntityStrict(); - } - } else { - this._parseLegacyEntity(); - } - - this._state = this._baseState; - this._index--; - } -}; - -Tokenizer.prototype._decodeNumericEntity = function(offset, base) { - var sectionStart = this._sectionStart + offset; - - if (sectionStart !== this._index) { - //parse entity - var entity = this._buffer.substring(sectionStart, this._index); - var parsed = parseInt(entity, base); - - this._emitPartial(decodeCodePoint(parsed)); - this._sectionStart = this._index; - } else { - this._sectionStart--; - } - - this._state = this._baseState; -}; - -Tokenizer.prototype._stateInNumericEntity = function(c) { - if (c === ";") { - this._decodeNumericEntity(2, 10); - this._sectionStart++; - } else if (c < "0" || c > "9") { - if (!this._xmlMode) { - this._decodeNumericEntity(2, 10); - } else { - this._state = this._baseState; - } - this._index--; - } -}; - -Tokenizer.prototype._stateInHexEntity = function(c) { - if (c === ";") { - this._decodeNumericEntity(3, 16); - this._sectionStart++; - } else if ( - (c < "a" || c > "f") && - (c < "A" || c > "F") && - (c < "0" || c > "9") - ) { - if (!this._xmlMode) { - this._decodeNumericEntity(3, 16); - } else { - this._state = this._baseState; - } - this._index--; - } -}; - -Tokenizer.prototype._cleanup = function() { - if (this._sectionStart < 0) { - this._buffer = ""; - this._bufferOffset += this._index; - this._index = 0; - } else if (this._running) { - if (this._state === TEXT) { - if (this._sectionStart !== this._index) { - this._cbs.ontext(this._buffer.substr(this._sectionStart)); - } - this._buffer = ""; - this._bufferOffset += this._index; - this._index = 0; - } else if (this._sectionStart === this._index) { - //the section just started - this._buffer = ""; - this._bufferOffset += this._index; - this._index = 0; - } else { - //remove everything unnecessary - this._buffer = this._buffer.substr(this._sectionStart); - this._index -= this._sectionStart; - this._bufferOffset += this._sectionStart; - } - - this._sectionStart = 0; - } -}; - -//TODO make events conditional -Tokenizer.prototype.write = function(chunk) { - if (this._ended) this._cbs.onerror(Error(".write() after done!")); - - this._buffer += chunk; - this._parse(); -}; - -Tokenizer.prototype._parse = function() { - while (this._index < this._buffer.length && this._running) { - var c = this._buffer.charAt(this._index); - if (this._state === TEXT) { - this._stateText(c); - } else if (this._state === BEFORE_TAG_NAME) { - this._stateBeforeTagName(c); - } else if (this._state === IN_TAG_NAME) { - this._stateInTagName(c); - } else if (this._state === BEFORE_CLOSING_TAG_NAME) { - this._stateBeforeCloseingTagName(c); - } else if (this._state === IN_CLOSING_TAG_NAME) { - this._stateInCloseingTagName(c); - } else if (this._state === AFTER_CLOSING_TAG_NAME) { - this._stateAfterCloseingTagName(c); - } else if (this._state === IN_SELF_CLOSING_TAG) { - this._stateInSelfClosingTag(c); - } else if (this._state === BEFORE_ATTRIBUTE_NAME) { - - /* - * attributes - */ - this._stateBeforeAttributeName(c); - } else if (this._state === IN_ATTRIBUTE_NAME) { - this._stateInAttributeName(c); - } else if (this._state === AFTER_ATTRIBUTE_NAME) { - this._stateAfterAttributeName(c); - } else if (this._state === BEFORE_ATTRIBUTE_VALUE) { - this._stateBeforeAttributeValue(c); - } else if (this._state === IN_ATTRIBUTE_VALUE_DQ) { - this._stateInAttributeValueDoubleQuotes(c); - } else if (this._state === IN_ATTRIBUTE_VALUE_SQ) { - this._stateInAttributeValueSingleQuotes(c); - } else if (this._state === IN_ATTRIBUTE_VALUE_NQ) { - this._stateInAttributeValueNoQuotes(c); - } else if (this._state === BEFORE_DECLARATION) { - - /* - * declarations - */ - this._stateBeforeDeclaration(c); - } else if (this._state === IN_DECLARATION) { - this._stateInDeclaration(c); - } else if (this._state === IN_PROCESSING_INSTRUCTION) { - - /* - * processing instructions - */ - this._stateInProcessingInstruction(c); - } else if (this._state === BEFORE_COMMENT) { - - /* - * comments - */ - this._stateBeforeComment(c); - } else if (this._state === IN_COMMENT) { - this._stateInComment(c); - } else if (this._state === AFTER_COMMENT_1) { - this._stateAfterComment1(c); - } else if (this._state === AFTER_COMMENT_2) { - this._stateAfterComment2(c); - } else if (this._state === BEFORE_CDATA_1) { - - /* - * cdata - */ - this._stateBeforeCdata1(c); - } else if (this._state === BEFORE_CDATA_2) { - this._stateBeforeCdata2(c); - } else if (this._state === BEFORE_CDATA_3) { - this._stateBeforeCdata3(c); - } else if (this._state === BEFORE_CDATA_4) { - this._stateBeforeCdata4(c); - } else if (this._state === BEFORE_CDATA_5) { - this._stateBeforeCdata5(c); - } else if (this._state === BEFORE_CDATA_6) { - this._stateBeforeCdata6(c); - } else if (this._state === IN_CDATA) { - this._stateInCdata(c); - } else if (this._state === AFTER_CDATA_1) { - this._stateAfterCdata1(c); - } else if (this._state === AFTER_CDATA_2) { - this._stateAfterCdata2(c); - } else if (this._state === BEFORE_SPECIAL) { - - /* - * special tags - */ - this._stateBeforeSpecial(c); - } else if (this._state === BEFORE_SPECIAL_END) { - this._stateBeforeSpecialEnd(c); - } else if (this._state === BEFORE_SCRIPT_1) { - - /* - * script - */ - this._stateBeforeScript1(c); - } else if (this._state === BEFORE_SCRIPT_2) { - this._stateBeforeScript2(c); - } else if (this._state === BEFORE_SCRIPT_3) { - this._stateBeforeScript3(c); - } else if (this._state === BEFORE_SCRIPT_4) { - this._stateBeforeScript4(c); - } else if (this._state === BEFORE_SCRIPT_5) { - this._stateBeforeScript5(c); - } else if (this._state === AFTER_SCRIPT_1) { - this._stateAfterScript1(c); - } else if (this._state === AFTER_SCRIPT_2) { - this._stateAfterScript2(c); - } else if (this._state === AFTER_SCRIPT_3) { - this._stateAfterScript3(c); - } else if (this._state === AFTER_SCRIPT_4) { - this._stateAfterScript4(c); - } else if (this._state === AFTER_SCRIPT_5) { - this._stateAfterScript5(c); - } else if (this._state === BEFORE_STYLE_1) { - - /* - * style - */ - this._stateBeforeStyle1(c); - } else if (this._state === BEFORE_STYLE_2) { - this._stateBeforeStyle2(c); - } else if (this._state === BEFORE_STYLE_3) { - this._stateBeforeStyle3(c); - } else if (this._state === BEFORE_STYLE_4) { - this._stateBeforeStyle4(c); - } else if (this._state === AFTER_STYLE_1) { - this._stateAfterStyle1(c); - } else if (this._state === AFTER_STYLE_2) { - this._stateAfterStyle2(c); - } else if (this._state === AFTER_STYLE_3) { - this._stateAfterStyle3(c); - } else if (this._state === AFTER_STYLE_4) { - this._stateAfterStyle4(c); - } else if (this._state === BEFORE_ENTITY) { - - /* - * entities - */ - this._stateBeforeEntity(c); - } else if (this._state === BEFORE_NUMERIC_ENTITY) { - this._stateBeforeNumericEntity(c); - } else if (this._state === IN_NAMED_ENTITY) { - this._stateInNamedEntity(c); - } else if (this._state === IN_NUMERIC_ENTITY) { - this._stateInNumericEntity(c); - } else if (this._state === IN_HEX_ENTITY) { - this._stateInHexEntity(c); - } else { - this._cbs.onerror(Error("unknown _state"), this._state); - } - - this._index++; - } - - this._cleanup(); -}; - -Tokenizer.prototype.pause = function() { - this._running = false; -}; -Tokenizer.prototype.resume = function() { - this._running = true; - - if (this._index < this._buffer.length) { - this._parse(); - } - if (this._ended) { - this._finish(); - } -}; - -Tokenizer.prototype.end = function(chunk) { - if (this._ended) this._cbs.onerror(Error(".end() after done!")); - if (chunk) this.write(chunk); - - this._ended = true; - - if (this._running) this._finish(); -}; - -Tokenizer.prototype._finish = function() { - //if there is remaining data, emit it in a reasonable way - if (this._sectionStart < this._index) { - this._handleTrailingData(); - } - - this._cbs.onend(); -}; - -Tokenizer.prototype._handleTrailingData = function() { - var data = this._buffer.substr(this._sectionStart); - - if ( - this._state === IN_CDATA || - this._state === AFTER_CDATA_1 || - this._state === AFTER_CDATA_2 - ) { - this._cbs.oncdata(data); - } else if ( - this._state === IN_COMMENT || - this._state === AFTER_COMMENT_1 || - this._state === AFTER_COMMENT_2 - ) { - this._cbs.oncomment(data); - } else if (this._state === IN_NAMED_ENTITY && !this._xmlMode) { - this._parseLegacyEntity(); - if (this._sectionStart < this._index) { - this._state = this._baseState; - this._handleTrailingData(); - } - } else if (this._state === IN_NUMERIC_ENTITY && !this._xmlMode) { - this._decodeNumericEntity(2, 10); - if (this._sectionStart < this._index) { - this._state = this._baseState; - this._handleTrailingData(); - } - } else if (this._state === IN_HEX_ENTITY && !this._xmlMode) { - this._decodeNumericEntity(3, 16); - if (this._sectionStart < this._index) { - this._state = this._baseState; - this._handleTrailingData(); - } - } else if ( - this._state !== IN_TAG_NAME && - this._state !== BEFORE_ATTRIBUTE_NAME && - this._state !== BEFORE_ATTRIBUTE_VALUE && - this._state !== AFTER_ATTRIBUTE_NAME && - this._state !== IN_ATTRIBUTE_NAME && - this._state !== IN_ATTRIBUTE_VALUE_SQ && - this._state !== IN_ATTRIBUTE_VALUE_DQ && - this._state !== IN_ATTRIBUTE_VALUE_NQ && - this._state !== IN_CLOSING_TAG_NAME - ) { - this._cbs.ontext(data); - } - //else, ignore remaining data - //TODO add a way to remove current tag -}; - -Tokenizer.prototype.reset = function() { - Tokenizer.call( - this, - { xmlMode: this._xmlMode, decodeEntities: this._decodeEntities }, - this._cbs - ); -}; - -Tokenizer.prototype.getAbsoluteIndex = function() { - return this._bufferOffset + this._index; -}; - -Tokenizer.prototype._getSection = function() { - return this._buffer.substring(this._sectionStart, this._index); -}; - -Tokenizer.prototype._emitToken = function(name) { - this._cbs[name](this._getSection()); - this._sectionStart = -1; -}; - -Tokenizer.prototype._emitPartial = function(value) { - if (this._baseState !== TEXT) { - this._cbs.onattribdata(value); //TODO implement the new event - } else { - this._cbs.ontext(value); - } -}; - -},{"entities/lib/decode_codepoint.js":"FSTM","entities/maps/entities.json":"ExGN","entities/maps/legacy.json":"erYB","entities/maps/xml.json":"XK3y"}],"xt1J":[function(require,module,exports) { -var Tokenizer = require("./Tokenizer.js"); - -/* - Options: - - xmlMode: Disables the special behavior for script/style tags (false by default) - lowerCaseAttributeNames: call .toLowerCase for each attribute name (true if xmlMode is `false`) - lowerCaseTags: call .toLowerCase for each tag name (true if xmlMode is `false`) -*/ - -/* - Callbacks: - - oncdataend, - oncdatastart, - onclosetag, - oncomment, - oncommentend, - onerror, - onopentag, - onprocessinginstruction, - onreset, - ontext -*/ - -var formTags = { - input: true, - option: true, - optgroup: true, - select: true, - button: true, - datalist: true, - textarea: true -}; - -var openImpliesClose = { - tr: { tr: true, th: true, td: true }, - th: { th: true }, - td: { thead: true, th: true, td: true }, - body: { head: true, link: true, script: true }, - li: { li: true }, - p: { p: true }, - h1: { p: true }, - h2: { p: true }, - h3: { p: true }, - h4: { p: true }, - h5: { p: true }, - h6: { p: true }, - select: formTags, - input: formTags, - output: formTags, - button: formTags, - datalist: formTags, - textarea: formTags, - option: { option: true }, - optgroup: { optgroup: true } -}; - -var voidElements = { - __proto__: null, - area: true, - base: true, - basefont: true, - br: true, - col: true, - command: true, - embed: true, - frame: true, - hr: true, - img: true, - input: true, - isindex: true, - keygen: true, - link: true, - meta: true, - param: true, - source: true, - track: true, - wbr: true -}; - -var foreignContextElements = { - __proto__: null, - math: true, - svg: true -}; -var htmlIntegrationElements = { - __proto__: null, - mi: true, - mo: true, - mn: true, - ms: true, - mtext: true, - "annotation-xml": true, - foreignObject: true, - desc: true, - title: true -}; - -var re_nameEnd = /\s|\//; - -function Parser(cbs, options) { - this._options = options || {}; - this._cbs = cbs || {}; - - this._tagname = ""; - this._attribname = ""; - this._attribvalue = ""; - this._attribs = null; - this._stack = []; - this._foreignContext = []; - - this.startIndex = 0; - this.endIndex = null; - - this._lowerCaseTagNames = - "lowerCaseTags" in this._options - ? !!this._options.lowerCaseTags - : !this._options.xmlMode; - this._lowerCaseAttributeNames = - "lowerCaseAttributeNames" in this._options - ? !!this._options.lowerCaseAttributeNames - : !this._options.xmlMode; - - if (this._options.Tokenizer) { - Tokenizer = this._options.Tokenizer; - } - this._tokenizer = new Tokenizer(this._options, this); - - if (this._cbs.onparserinit) this._cbs.onparserinit(this); -} - -require("inherits")(Parser, require("events").EventEmitter); - -Parser.prototype._updatePosition = function(initialOffset) { - if (this.endIndex === null) { - if (this._tokenizer._sectionStart <= initialOffset) { - this.startIndex = 0; - } else { - this.startIndex = this._tokenizer._sectionStart - initialOffset; - } - } else this.startIndex = this.endIndex + 1; - this.endIndex = this._tokenizer.getAbsoluteIndex(); -}; - -//Tokenizer event handlers -Parser.prototype.ontext = function(data) { - this._updatePosition(1); - this.endIndex--; - - if (this._cbs.ontext) this._cbs.ontext(data); -}; - -Parser.prototype.onopentagname = function(name) { - if (this._lowerCaseTagNames) { - name = name.toLowerCase(); - } - - this._tagname = name; - - if (!this._options.xmlMode && name in openImpliesClose) { - for ( - var el; - (el = this._stack[this._stack.length - 1]) in - openImpliesClose[name]; - this.onclosetag(el) - ); - } - - if (this._options.xmlMode || !(name in voidElements)) { - this._stack.push(name); - if (name in foreignContextElements) this._foreignContext.push(true); - else if (name in htmlIntegrationElements) - this._foreignContext.push(false); - } - - if (this._cbs.onopentagname) this._cbs.onopentagname(name); - if (this._cbs.onopentag) this._attribs = {}; -}; - -Parser.prototype.onopentagend = function() { - this._updatePosition(1); - - if (this._attribs) { - if (this._cbs.onopentag) - this._cbs.onopentag(this._tagname, this._attribs); - this._attribs = null; - } - - if ( - !this._options.xmlMode && - this._cbs.onclosetag && - this._tagname in voidElements - ) { - this._cbs.onclosetag(this._tagname); - } - - this._tagname = ""; -}; - -Parser.prototype.onclosetag = function(name) { - this._updatePosition(1); - - if (this._lowerCaseTagNames) { - name = name.toLowerCase(); - } - - if (name in foreignContextElements || name in htmlIntegrationElements) { - this._foreignContext.pop(); - } - - if ( - this._stack.length && - (!(name in voidElements) || this._options.xmlMode) - ) { - var pos = this._stack.lastIndexOf(name); - if (pos !== -1) { - if (this._cbs.onclosetag) { - pos = this._stack.length - pos; - while (pos--) this._cbs.onclosetag(this._stack.pop()); - } else this._stack.length = pos; - } else if (name === "p" && !this._options.xmlMode) { - this.onopentagname(name); - this._closeCurrentTag(); - } - } else if (!this._options.xmlMode && (name === "br" || name === "p")) { - this.onopentagname(name); - this._closeCurrentTag(); - } -}; - -Parser.prototype.onselfclosingtag = function() { - if ( - this._options.xmlMode || - this._options.recognizeSelfClosing || - this._foreignContext[this._foreignContext.length - 1] - ) { - this._closeCurrentTag(); - } else { - this.onopentagend(); - } -}; - -Parser.prototype._closeCurrentTag = function() { - var name = this._tagname; - - this.onopentagend(); - - //self-closing tags will be on the top of the stack - //(cheaper check than in onclosetag) - if (this._stack[this._stack.length - 1] === name) { - if (this._cbs.onclosetag) { - this._cbs.onclosetag(name); - } - this._stack.pop(); - - } -}; - -Parser.prototype.onattribname = function(name) { - if (this._lowerCaseAttributeNames) { - name = name.toLowerCase(); - } - this._attribname = name; -}; - -Parser.prototype.onattribdata = function(value) { - this._attribvalue += value; -}; - -Parser.prototype.onattribend = function() { - if (this._cbs.onattribute) - this._cbs.onattribute(this._attribname, this._attribvalue); - if ( - this._attribs && - !Object.prototype.hasOwnProperty.call(this._attribs, this._attribname) - ) { - this._attribs[this._attribname] = this._attribvalue; - } - this._attribname = ""; - this._attribvalue = ""; -}; - -Parser.prototype._getInstructionName = function(value) { - var idx = value.search(re_nameEnd), - name = idx < 0 ? value : value.substr(0, idx); - - if (this._lowerCaseTagNames) { - name = name.toLowerCase(); - } - - return name; -}; - -Parser.prototype.ondeclaration = function(value) { - if (this._cbs.onprocessinginstruction) { - var name = this._getInstructionName(value); - this._cbs.onprocessinginstruction("!" + name, "!" + value); - } -}; - -Parser.prototype.onprocessinginstruction = function(value) { - if (this._cbs.onprocessinginstruction) { - var name = this._getInstructionName(value); - this._cbs.onprocessinginstruction("?" + name, "?" + value); - } -}; - -Parser.prototype.oncomment = function(value) { - this._updatePosition(4); - - if (this._cbs.oncomment) this._cbs.oncomment(value); - if (this._cbs.oncommentend) this._cbs.oncommentend(); -}; - -Parser.prototype.oncdata = function(value) { - this._updatePosition(1); - - if (this._options.xmlMode || this._options.recognizeCDATA) { - if (this._cbs.oncdatastart) this._cbs.oncdatastart(); - if (this._cbs.ontext) this._cbs.ontext(value); - if (this._cbs.oncdataend) this._cbs.oncdataend(); - } else { - this.oncomment("[CDATA[" + value + "]]"); - } -}; - -Parser.prototype.onerror = function(err) { - if (this._cbs.onerror) this._cbs.onerror(err); -}; - -Parser.prototype.onend = function() { - if (this._cbs.onclosetag) { - for ( - var i = this._stack.length; - i > 0; - this._cbs.onclosetag(this._stack[--i]) - ); - } - if (this._cbs.onend) this._cbs.onend(); -}; - -//Resets the parser to a blank state, ready to parse a new HTML document -Parser.prototype.reset = function() { - if (this._cbs.onreset) this._cbs.onreset(); - this._tokenizer.reset(); - - this._tagname = ""; - this._attribname = ""; - this._attribs = null; - this._stack = []; - - if (this._cbs.onparserinit) this._cbs.onparserinit(this); -}; - -//Parses a complete HTML document and pushes it to the handler -Parser.prototype.parseComplete = function(data) { - this.reset(); - this.end(data); -}; - -Parser.prototype.write = function(chunk) { - this._tokenizer.write(chunk); -}; - -Parser.prototype.end = function(chunk) { - this._tokenizer.end(chunk); -}; - -Parser.prototype.pause = function() { - this._tokenizer.pause(); -}; - -Parser.prototype.resume = function() { - this._tokenizer.resume(); -}; - -//alias for backwards compat -Parser.prototype.parseChunk = Parser.prototype.write; -Parser.prototype.done = Parser.prototype.end; - -module.exports = Parser; - -},{"./Tokenizer.js":"I1ZB","inherits":"Bm0n","events":"FRpO"}],"y3WH":[function(require,module,exports) { -//Types of elements found in the DOM -module.exports = { - Text: "text", //Text - Directive: "directive", // - Comment: "comment", // - Script: "script", //