PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-core/dist/src/account-lib/util
Просмотр файла: crypto.js
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.hexToBigInt = exports.convertHexArrToBigIntArr = exports.convertBigIntArrToHexArr = exports.bigIntToHex = void 0;
exports.xpubToUncompressedPub = xpubToUncompressedPub;
exports.xpubToCompressedPub = xpubToCompressedPub;
exports.xprvToRawPrv = xprvToRawPrv;
exports.rawPrvToExtendedKeys = rawPrvToExtendedKeys;
exports.isValidXpub = isValidXpub;
exports.isValidXprv = isValidXprv;
exports.isValidPub = isValidPub;
exports.isValidPrv = isValidPrv;
exports.isValidEd25519Seed = isValidEd25519Seed;
exports.isValidEd25519SecretKey = isValidEd25519SecretKey;
exports.isValidEd25519PublicKey = isValidEd25519PublicKey;
exports.isValidBLSPrivateKey = isValidBLSPrivateKey;
exports.isValidBLSPublicKey = isValidBLSPublicKey;
exports.isValidBLSSignature = isValidBLSSignature;
exports.toHex = toHex;
exports.isBase58 = isBase58;
exports.toUint8Array = toUint8Array;
const utxo_lib_1 = require("@bitgo/utxo-lib");
const hex = __importStar(require("@stablelib/hex"));
const bs58_1 = __importDefault(require("bs58"));
const bls = __importStar(require("noble-bls12-381"));
const strip_hex_prefix_1 = __importDefault(require("strip-hex-prefix"));
const nacl = __importStar(require("tweetnacl"));
/**
* @deprecated - use @bitgo/sdk-lib-mpc instead
*/
var sdk_lib_mpc_1 = require("@bitgo/sdk-lib-mpc");
Object.defineProperty(exports, "bigIntToHex", { enumerable: true, get: function () { return sdk_lib_mpc_1.bigIntToHex; } });
Object.defineProperty(exports, "convertBigIntArrToHexArr", { enumerable: true, get: function () { return sdk_lib_mpc_1.convertBigIntArrToHexArr; } });
Object.defineProperty(exports, "convertHexArrToBigIntArr", { enumerable: true, get: function () { return sdk_lib_mpc_1.convertHexArrToBigIntArr; } });
Object.defineProperty(exports, "hexToBigInt", { enumerable: true, get: function () { return sdk_lib_mpc_1.hexToBigInt; } });
/**
* @param xpub - a base-58 encoded extended public key (BIP32)
* @param compressed flag to determine if return key should be compressed/uncompressed
* @return a compressed or an uncompresseed public key in hexadecimal
*/
function xPubToPub(xpub, compressed) {
if (!isValidXpub(xpub)) {
throw new Error('invalid xpub');
}
return utxo_lib_1.ECPair.fromPublicKey(utxo_lib_1.bip32.fromBase58(xpub, utxo_lib_1.networks.bitcoin).publicKey, {
compressed,
}).publicKey.toString('hex');
}
/**
* @param {string} xpub - a base-58 encoded extended public key (BIP32)
* @returns {string} the uncompressed public key in hexadecimal
*/
function xpubToUncompressedPub(xpub) {
return xPubToPub(xpub, false);
}
/**
* @param {string} xpub - a base-58 encoded extended public key (BIP32)
* @returns {string} the uncompressed public key in hexadecimal
*/
function xpubToCompressedPub(xpub) {
return xPubToPub(xpub, true);
}
/**
* @param {string} xprv - base58-encoded extended private key (BIP32)
* @returns {string} the hex-encoded raw private key
*/
function xprvToRawPrv(xprv) {
if (!isValidXprv(xprv)) {
throw new Error('invalid xprv');
}
const { privateKey } = utxo_lib_1.bip32.fromBase58(xprv, utxo_lib_1.networks.bitcoin);
if (!privateKey) {
throw new Error('invalid xprv');
}
return privateKey.toString('hex');
}
/**
* @param {string} prv - Private key in hex format to get the extended keys for
* @returns {ExtendedKeys} xprv and xpub in string format
*/
function rawPrvToExtendedKeys(prv) {
const hd = utxo_lib_1.bip32.fromPrivateKey(Buffer.from(prv, 'hex'), Buffer.alloc(32));
return {
xprv: hd.toBase58(),
xpub: hd.neutered().toBase58(),
};
}
/**
* Whether the input is a valid BIP32 xpub or not
*
* @param xpub
*/
function isValidXpub(xpub) {
if (xpub.substr(0, 4) !== 'xpub') {
// check for xpub formats we don't support, such as tpub
return false;
}
try {
utxo_lib_1.bip32.fromBase58(xpub, utxo_lib_1.networks.bitcoin);
}
catch (err) {
return false;
}
// if HD generation didn't throw, it is a valid xpub
return true;
}
/**
* Whether the input is a valid BIP32 xprv or not
*
* @param xprv
*/
function isValidXprv(xprv) {
if (xprv.substr(0, 4) !== 'xprv') {
// check for xprv formats we don't support
return false;
}
try {
utxo_lib_1.bip32.fromBase58(xprv, utxo_lib_1.networks.bitcoin);
}
catch (err) {
return false;
}
// if HD generation didn't throw, it is a valid xprv
return true;
}
/**
* Whether the input is a valid secp256k1 public key
*
* @param pub
*/
function isValidPub(pub) {
try {
utxo_lib_1.ECPair.fromPublicKey(Buffer.from(pub, 'hex'));
}
catch (e) {
return false;
}
return true;
}
/**
* Whether the input is a valid secp256k1 private key
*
* @param prv
*/
function isValidPrv(prv) {
try {
utxo_lib_1.ECPair.fromPrivateKey(Buffer.from(prv, 'hex'));
}
catch (e) {
return false;
}
return true;
}
/**
* Whether the input is a valid ed25519 private key
*
* @param {string} prv A hexadecimal private key to validate
* @returns {boolean} Whether the input is a valid public key or not
*/
function isValidEd25519Seed(prv) {
try {
const decodedPrv = toUint8Array(prv);
return decodedPrv.length === nacl.sign.seedLength;
}
catch (e) {
return false;
}
}
/**
* Whether the input is a valid ed25519 private key
*
* @param {string} prv A hexadecimal private key to validate
* @returns {boolean} Whether the input is a valid public key or not
*/
function isValidEd25519SecretKey(prv) {
try {
const decodedPrv = toUint8Array(prv);
return decodedPrv.length === nacl.sign.secretKeyLength;
}
catch (e) {
return false;
}
}
/**
* Whether the input is a valid ed25519 public key
*
* @param {string} pub A hexadecimal public key to validate
* @returns {boolean} Whether the input is a valid public key or not
*/
function isValidEd25519PublicKey(pub) {
try {
const decodedPub = new Uint8Array(Buffer.from(pub, 'hex'));
return decodedPub.length === nacl.sign.publicKeyLength;
}
catch (e) {
return false;
}
}
/**
* Whether the input is a valid BLS private key
*
* @param {string} prv a private key to validate
* @returns {boolean} Whether the input is a valid private key or not
*/
function isValidBLSPrivateKey(prv) {
try {
return bls.Fr.isValid(BigInt('0x' + prv));
}
catch (e) {
return false;
}
}
/**
* Whether input is a valid BLS public key
*
* @param {string} pub the public key to validate
* @returns {boolean} Whether input is a valid public key or not
*/
function isValidBLSPublicKey(pub) {
try {
bls.PointG1.fromCompressedHex((0, strip_hex_prefix_1.default)(pub)).assertValidity();
return true;
}
catch (e) {
return false;
}
}
/**
* Whether input is a valid BLS signature
*
* @param {string} sig the signature to validate
* @returns {boolean} Whether input is a valid signature or not
*/
function isValidBLSSignature(sig) {
try {
bls.PointG2.fromSignature(sig).assertValidity();
return true;
}
catch (e) {
return false;
}
}
/**
* Returns an hex string of the given buffer
*
* @param {Buffer | Uint8Array} buffer - the buffer to be converted to hex
* @returns {string} - the hex value
*/
function toHex(buffer) {
return hex.encode(buffer, true);
}
/**
* Check if base58 decoded string is equale to length
*
* @param {string} value - string to be checked
* @param {number} length - expected decoded length
* @return {boolean} if the string can decoded as base58 and match the expected length
*/
function isBase58(value, length) {
try {
return !!value && bs58_1.default.decode(value).length === length;
}
catch (e) {
return false;
}
}
/**
* Returns a Uint8Array of the given hex string
*
* @param {string} str - the hex string to be converted
* @returns {string} - the Uint8Array value
*/
function toUint8Array(str) {
return hex.decode(str);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J5cHRvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FjY291bnQtbGliL3V0aWwvY3J5cHRvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQStCQSxzREFFQztBQU1ELGtEQUVDO0FBTUQsb0NBVUM7QUFNRCxvREFNQztBQU9ELGtDQVlDO0FBT0Qsa0NBWUM7QUFPRCxnQ0FPQztBQU9ELGdDQU9DO0FBUUQsZ0RBT0M7QUFRRCwwREFPQztBQVFELDBEQU9DO0FBUUQsb0RBTUM7QUFRRCxrREFPQztBQVFELGtEQU9DO0FBUUQsc0JBRUM7QUFVRCw0QkFNQztBQVFELG9DQUVDO0FBcFFELDhDQUEwRDtBQUMxRCxvREFBc0M7QUFDdEMsZ0RBQXdCO0FBQ3hCLHFEQUF1QztBQUN2Qyx3RUFBOEM7QUFDOUMsZ0RBQWtDO0FBR2xDOztHQUVHO0FBQ0gsa0RBQWtIO0FBQXpHLDBHQUFBLFdBQVcsT0FBQTtBQUFFLHVIQUFBLHdCQUF3QixPQUFBO0FBQUUsdUhBQUEsd0JBQXdCLE9BQUE7QUFBRSwwR0FBQSxXQUFXLE9BQUE7QUFFckY7Ozs7R0FJRztBQUNILFNBQVMsU0FBUyxDQUFDLElBQVksRUFBRSxVQUFtQjtJQUNsRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsT0FBTyxpQkFBTSxDQUFDLGFBQWEsQ0FBQyxnQkFBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsbUJBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUU7UUFDOUUsVUFBVTtLQUNYLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixxQkFBcUIsQ0FBQyxJ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QUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDO0lBQ3pELENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1gsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsWUFBWSxDQUFDLEdBQVc7SUFDdEMsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBiaXAzMiwgRUNQYWlyLCBuZXR3b3JrcyB9IGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgKiBhcyBoZXggZnJvbSAnQHN0YWJsZWxpYi9oZXgnO1xuaW1wb3J0IGJzNTggZnJvbSAnYnM1OCc7XG5pbXBvcnQgKiBhcyBibHMgZnJvbSAnbm9ibGUtYmxzMTItMzgxJztcbmltcG9ydCBzdHJpcEhleFByZWZpeCBmcm9tICdzdHJpcC1oZXgtcHJlZml4JztcbmltcG9ydCAqIGFzIG5hY2wgZnJvbSAndHdlZXRuYWNsJztcbmltcG9ydCB7IEV4dGVuZGVkS2V5cyB9IGZyb20gJy4uL2Jhc2VDb2luJztcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCAtIHVzZSBAYml0Z28vc2RrLWxpYi1tcGMgaW5zdGVhZFxuICovXG5leHBvcnQgeyBiaWdJbnRUb0hleCwgY29udmVydEJpZ0ludEFyclRvSGV4QXJyLCBjb252ZXJ0SGV4QXJyVG9CaWdJbnRBcnIsIGhleFRvQmlnSW50IH0gZnJvbSAnQGJpdGdvL3Nkay1saWItbXBjJztcblxuLyoqXG4gKiBAcGFyYW0geHB1YiAtIGEgYmFzZS01OCBlbmNvZGVkIGV4dGVuZGVkIHB1YmxpYyBrZXkgKEJJUDMyKVxuICogQHBhcmFtIGNvbXByZXNzZWQgZmxhZyB0byBkZXRlcm1pbmUgaWYgcmV0dXJuIGtleSBzaG91bGQgYmUgY29tcHJlc3NlZC91bmNvbXByZXNzZWRcbiAqIEByZXR1cm4gYSBjb21wcmVzc2VkIG9yIGFuIHVuY29tcHJlc3NlZWQgcHVibGljIGtleSBpbiBoZXhhZGVjaW1hbFxuICovXG5mdW5jdGlvbiB4UHViVG9QdWIoeHB1Yjogc3RyaW5nLCBjb21wcmVzc2VkOiBib29sZWFuKSB7XG4gIGlmICghaXNWYWxpZFhwdWIoeHB1YikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgeHB1YicpO1xuICB9XG4gIHJldHVybiBFQ1BhaXIuZnJvbVB1YmxpY0tleShiaXAzMi5mcm9tQmFzZTU4KHhwdWIsIG5ldHdvcmtzLmJpdGNvaW4pLnB1YmxpY0tleSwge1xuICAgIGNvbXByZXNzZWQsXG4gIH0pLnB1YmxpY0tleS50b1N0cmluZygnaGV4Jyk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHhwdWIgLSBhIGJhc2UtNTggZW5jb2RlZCBleHRlbmRlZCBwdWJsaWMga2V5IChCSVAzMilcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSB1bmNvbXByZXNzZWQgcHVibGljIGtleSBpbiBoZXhhZGVjaW1hbFxuICovXG5leHBvcnQgZnVuY3Rpb24geHB1YlRvVW5jb21wcmVzc2VkUHViKHhwdWI6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB4UHViVG9QdWIoeHB1YiwgZmFsc2UpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB4cHViIC0gYSBiYXNlLTU4IGVuY29kZWQgZXh0ZW5kZWQgcHVibGljIGtleSAoQklQMzIpXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgdW5jb21wcmVzc2VkIHB1YmxpYyBrZXkgaW4gaGV4YWRlY2ltYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHhwdWJUb0NvbXByZXNzZWRQdWIoeHB1Yjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHhQdWJUb1B1Yih4cHViLCB0cnVlKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30geHBydiAtIGJhc2U1OC1lbmNvZGVkIGV4dGVuZGVkIHByaXZhdGUga2V5IChCSVAzMilcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBoZXgtZW5jb2RlZCByYXcgcHJpdmF0ZSBrZXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHhwcnZUb1Jhd1Bydih4cHJ2OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIWlzVmFsaWRYcHJ2KHhwcnYpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHhwcnYnKTtcbiAgfVxuXG4gIGNvbnN0IHsgcHJpdmF0ZUtleSB9ID0gYmlwMzIuZnJvbUJhc2U1OCh4cHJ2LCBuZXR3b3Jrcy5iaXRjb2luKTtcbiAgaWYgKCFwcml2YXRlS2V5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHhwcnYnKTtcbiAgfVxuICByZXR1cm4gcHJpdmF0ZUtleS50b1N0cmluZygnaGV4Jyk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHBydiAtIFByaXZhdGUga2V5IGluIGhleCBmb3JtYXQgdG8gZ2V0IHRoZSBleHRlbmRlZCBrZXlzIGZvclxuICogQHJldHVybnMge0V4dGVuZGVkS2V5c30geHBydiBhbmQgeHB1YiBpbiBzdHJpbmcgZm9ybWF0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYXdQcnZUb0V4dGVuZGVkS2V5cyhwcnY6IHN0cmluZyk6IEV4dGVuZGVkS2V5cyB7XG4gIGNvbnN0IGhkID0gYmlwMzIuZnJvbVByaXZhdGVLZXkoQnVmZmVyLmZyb20ocHJ2LCAnaGV4JyksIEJ1ZmZlci5hbGxvYygzMikpO1xuICByZXR1cm4ge1xuICAgIHhwcnY6IGhkLnRvQmFzZTU4KCksXG4gICAgeHB1YjogaGQubmV1dGVyZWQoKS50b0Jhc2U1OCgpLFxuICB9O1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGlucHV0IGlzIGEgdmFsaWQgQklQMzIgeHB1YiBvciBub3RcbiAqXG4gKiBAcGFyYW0geHB1YlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFhwdWIoeHB1Yjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICh4cHViLnN1YnN0cigwLCA0KSAhPT0gJ3hwdWInKSB7XG4gICAgLy8gY2hlY2sgZm9yIHhwdWIgZm9ybWF0cyB3ZSBkb24ndCBzdXBwb3J0LCBzdWNoIGFzIHRwdWJcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdHJ5IHtcbiAgICBiaXAzMi5mcm9tQmFzZTU4KHhwdWIsIG5ldHdvcmtzLmJpdGNvaW4pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gaWYgSEQgZ2VuZXJhdGlvbiBkaWRuJ3QgdGhyb3csIGl0IGlzIGEgdmFsaWQgeHB1YlxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBpbnB1dCBpcyBhIHZhbGlkIEJJUDMyIHhwcnYgb3Igbm90XG4gKlxuICogQHBhcmFtIHhwcnZcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRYcHJ2KHhwcnY6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoeHBydi5zdWJzdHIoMCwgNCkgIT09ICd4cHJ2Jykge1xuICAgIC8vIGNoZWNrIGZvciB4cHJ2IGZvcm1hdHMgd2UgZG9uJ3Qgc3VwcG9ydFxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB0cnkge1xuICAgIGJpcDMyLmZyb21CYXNlNTgoeHBydiwgbmV0d29ya3MuYml0Y29pbik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBpZiBIRCBnZW5lcmF0aW9uIGRpZG4ndCB0aHJvdywgaXQgaXMgYSB2YWxpZCB4cHJ2XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGlucHV0IGlzIGEgdmFsaWQgc2VjcDI1NmsxIHB1YmxpYyBrZXlcbiAqXG4gKiBAcGFyYW0gcHViXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUHViKHB1Yjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgRUNQYWlyLmZyb21QdWJsaWNLZXkoQnVmZmVyLmZyb20ocHViLCAnaGV4JykpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGlucHV0IGlzIGEgdmFsaWQgc2VjcDI1NmsxIHByaXZhdGUga2V5XG4gKlxuICogQHBhcmFtIHBydlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFBydihwcnY6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIEVDUGFpci5mcm9tUHJpdmF0ZUtleShCdWZmZXIuZnJvbShwcnYsICdoZXgnKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgaW5wdXQgaXMgYSB2YWxpZCBlZDI1NTE5IHByaXZhdGUga2V5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBydiBBIGhleGFkZWNpbWFsIHByaXZhdGUga2V5IHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgaW5wdXQgaXMgYSB2YWxpZCBwdWJsaWMga2V5IG9yIG5vdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEVkMjU1MTlTZWVkKHBydjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGVjb2RlZFBydiA9IHRvVWludDhBcnJheShwcnYpO1xuICAgIHJldHVybiBkZWNvZGVkUHJ2Lmxlbmd0aCA9PT0gbmFjbC5zaWduLnNlZWRMZW5ndGg7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBpbnB1dCBpcyBhIHZhbGlkIGVkMjU1MTkgcHJpdmF0ZSBrZXlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJ2IEEgaGV4YWRlY2ltYWwgcHJpdmF0ZSBrZXkgdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBpbnB1dCBpcyBhIHZhbGlkIHB1YmxpYyBrZXkgb3Igbm90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRWQyNTUxOVNlY3JldEtleShwcnY6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGNvbnN0IGRlY29kZWRQcnYgPSB0b1VpbnQ4QXJyYXkocHJ2KTtcbiAgICByZXR1cm4gZGVjb2RlZFBydi5sZW5ndGggPT09IG5hY2wuc2lnbi5zZWNyZXRLZXlMZW5ndGg7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBpbnB1dCBpcyBhIHZhbGlkIGVkMjU1MTkgcHVibGljIGtleVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwdWIgQSBoZXhhZGVjaW1hbCBwdWJsaWMga2V5IHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgaW5wdXQgaXMgYSB2YWxpZCBwdWJsaWMga2V5IG9yIG5vdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEVkMjU1MTlQdWJsaWNLZXkocHViOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBkZWNvZGVkUHViID0gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20ocHViLCAnaGV4JykpO1xuICAgIHJldHVybiBkZWNvZGVkUHViLmxlbmd0aCA9PT0gbmFjbC5zaWduLnB1YmxpY0tleUxlbmd0aDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGlucHV0IGlzIGEgdmFsaWQgQkxTIHByaXZhdGUga2V5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBydiBhIHByaXZhdGUga2V5IHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgaW5wdXQgaXMgYSB2YWxpZCBwcml2YXRlIGtleSBvciBub3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRCTFNQcml2YXRlS2V5KHBydjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGJscy5Gci5pc1ZhbGlkKEJpZ0ludCgnMHgnICsgcHJ2KSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIGlucHV0IGlzIGEgdmFsaWQgQkxTIHB1YmxpYyBrZXlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHViIHRoZSBwdWJsaWMga2V5IHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBpbnB1dCBpcyBhIHZhbGlkIHB1YmxpYyBrZXkgb3Igbm90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQkxTUHVibGljS2V5KHB1Yjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgYmxzLlBvaW50RzEuZnJvbUNvbXByZXNzZWRIZXgoc3RyaXBIZXhQcmVmaXgocHViKSkuYXNzZXJ0VmFsaWRpdHkoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgaW5wdXQgaXMgYSB2YWxpZCBCTFMgc2lnbmF0dXJlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNpZyB0aGUgc2lnbmF0dXJlIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBpbnB1dCBpcyBhIHZhbGlkIHNpZ25hdHVyZSBvciBub3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRCTFNTaWduYXR1cmUoc2lnOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBibHMuUG9pbnRHMi5mcm9tU2lnbmF0dXJlKHNpZykuYXNzZXJ0VmFsaWRpdHkoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYW4gaGV4IHN0cmluZyBvZiB0aGUgZ2l2ZW4gYnVmZmVyXG4gKlxuICogQHBhcmFtIHtCdWZmZXIgfCBVaW50OEFycmF5fSBidWZmZXIgLSB0aGUgYnVmZmVyIHRvIGJlIGNvbnZlcnRlZCB0byBoZXhcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gdGhlIGhleCB2YWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9IZXgoYnVmZmVyOiBCdWZmZXIgfCBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgcmV0dXJuIGhleC5lbmNvZGUoYnVmZmVyLCB0cnVlKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBiYXNlNTggZGVjb2RlZCBzdHJpbmcgaXMgZXF1YWxlIHRvIGxlbmd0aFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIHN0cmluZyB0byBiZSBjaGVja2VkXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIC0gZXhwZWN0ZWQgZGVjb2RlZCBsZW5ndGhcbiAqIEByZXR1cm4ge2Jvb2xlYW59IGlmIHRoZSBzdHJpbmcgY2FuIGRlY29kZWQgYXMgYmFzZTU4IGFuZCBtYXRjaCB0aGUgZXhwZWN0ZWQgbGVuZ3RoXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQmFzZTU4KHZhbHVlOiBzdHJpbmcsIGxlbmd0aDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhdmFsdWUgJiYgYnM1OC5kZWNvZGUodmFsdWUpLmxlbmd0aCA9PT0gbGVuZ3RoO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIFVpbnQ4QXJyYXkgb2YgdGhlIGdpdmVuIGhleCBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIC0gdGhlIGhleCBzdHJpbmcgdG8gYmUgY29udmVydGVkXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBVaW50OEFycmF5IHZhbHVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1VpbnQ4QXJyYXkoc3RyOiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgcmV0dXJuIGhleC5kZWNvZGUoc3RyKTtcbn1cbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!