PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-algo/dist/src/lib
Просмотр файла: keyRegistrationBuilder.js
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.KeyRegistrationBuilder = void 0;
const bignumber_js_1 = __importDefault(require("bignumber.js"));
const algosdk_1 = __importDefault(require("algosdk"));
const sdk_core_1 = require("@bitgo/sdk-core");
const transactionBuilder_1 = require("./transactionBuilder");
const txnSchema_1 = require("./txnSchema");
const utils_1 = __importDefault(require("./utils"));
class KeyRegistrationBuilder extends transactionBuilder_1.TransactionBuilder {
constructor(coinConfig) {
super(coinConfig);
}
/**
* Sets the vote key
*
* @returns {KeyRegistrationBuilder} This Key Registration builder.
*
* @param {string} key The root participation public key. See Generate a Participation Key to learn more.
* https://developer.algorand.org/docs/reference/transactions/#key-registration-transaction
*/
voteKey(key) {
this._voteKey = key;
return this;
}
/**
* Sets the selection key
*
* @returns {KeyRegistrationBuilder} This Key Registration builder.
*
* @param {string} key The VRF public key for the account.
* https://developer.algorand.org/docs/reference/transactions/#key-registration-transaction
*/
selectionKey(key) {
this._selectionKey = key;
return this;
}
/**
* Sets the stateProof key
*
* @returns {KeyRegistrationBuilder} This Key Registration builder.
*
* @param {string} key The stateproof key. See consensus for more information.
* https://developer.algorand.org/docs/get-details/algorand_consensus/?from_query=state#state-proof-keys
*/
stateProofKey(key) {
utils_1.default.validateBase64(key);
this._stateProofKey = key;
return this;
}
/**
*Sets the vote first round
*
* @returns {KeyRegistrationBuilder} This Key Registration builder.
*
* @param {number} round The first round that the participation key is valid. Not to be confused with the FirstValid round of the keyreg transaction.
* https://developer.algorand.org/docs/reference/transactions/#key-registration-transaction
*/
voteFirst(round) {
this.validateValue(new bignumber_js_1.default(round));
this._voteFirst = round;
return this;
}
/**
* Sets the vote last round
*
* @returns {KeyRegistrationBuilder} This Key Registration builder.
*
* A recommended range is 3,000,000 rounds.
*
* @param {number} round No theoretical limit.
* https://developer.algorand.org/docs/run-a-node/participate/generate_keys/
*/
voteLast(round) {
this.validateValue(new bignumber_js_1.default(round));
this._voteLast = round;
return this;
}
/**
* Sets the vote key dilution
*
* @returns {KeyRegistrationBuilder} This Key Registration builder.
*
* Defaults to 10,000
*
* @param {number} size [10000]. To reduce the size of the participation key, set the key dilution value to roughly the square root of the range that the partkey is valid for.
* https://developer.algorand.org/docs/run-a-node/participate/generate_keys/#generate-the-participation-key-with-goal
* @param size
*/
voteKeyDilution(size = 10000) {
this.validateValue(new bignumber_js_1.default(size));
this._voteKeyDilution = size;
return this;
}
/**
* Sets the non participation flag
*
* @returns {KeyRegistrationBuilder} This Key Registration builder.
*
* @param {boolean} nonParticipation All new Algorand accounts are participating by default.
* This means that they earn rewards. Mark an account nonparticipating by setting this value to true and this account
* will no longer earn rewards NEVER.
* https://developer.algorand.org/docs/reference/transactions/#key-registration-transaction
*/
nonParticipation(nonParticipation) {
this._nonParticipation = nonParticipation;
return this;
}
buildAlgoTxn() {
return this.isOfflineKeyRegAccountLibTransaction()
? this.buildOfflineKeyRegTransaction()
: this.isNonParticipationKeyRegAccountLibTransaction()
? this.buildNonParticipationKeyRegTransaction()
: this.buildOnlineKeyRegTransaction();
}
buildOfflineKeyRegTransaction() {
return algosdk_1.default.makeKeyRegistrationTxnWithSuggestedParams(this._sender, this._note, undefined, // voteKey param
undefined, // selectionKey param
undefined, // voteFirst param
undefined, // voteLast param
undefined, // voteKeyDilution param
this.suggestedParams);
}
buildOnlineKeyRegTransaction() {
return algosdk_1.default.makeKeyRegistrationTxnWithSuggestedParams(this._sender, this._note, this._voteKey, this._selectionKey, this._voteFirst, this._voteLast, this._voteKeyDilution, this.suggestedParams, undefined, // reKeyTo param
undefined, // nonParticipation param
this._stateProofKey);
}
buildNonParticipationKeyRegTransaction() {
return algosdk_1.default.makeKeyRegistrationTxnWithSuggestedParams(this._sender, this._note, undefined, // voteKey param
undefined, // selectionKey param
undefined, // voteFirst param
undefined, // voteLast param
undefined, // voteKeyDilution param
this.suggestedParams, this._reKeyTo, true // nonParticipation param
);
}
get transactionType() {
return sdk_core_1.TransactionType.WalletInitialization;
}
/** @inheritdoc */
fromImplementation(rawTransaction) {
const tx = super.fromImplementation(rawTransaction);
const algoTxn = tx.getAlgoTransaction();
if (algoTxn) {
if (this.isNonParticipationKeyRegAlgoSDKTransaction(algoTxn)) {
this.nonParticipation(!!algoTxn.nonParticipation);
}
else if (this.isOnlineKeyRegAlgoSDKTransaction(algoTxn)) {
this.voteKey(algoTxn.voteKey.toString('base64'));
this.selectionKey(algoTxn.selectionKey.toString('base64'));
this.voteFirst(algoTxn.voteFirst);
this.voteLast(algoTxn.voteLast);
this.voteKeyDilution(algoTxn.voteKeyDilution);
if (algoTxn.stateProofKey) {
this.stateProofKey(algoTxn.stateProofKey.toString('base64'));
}
}
}
return tx;
}
/** @inheritdoc */
validateRawTransaction(rawTransaction) {
const decodeTxn = utils_1.default.decodeAlgoTxn(rawTransaction);
const algoTxn = decodeTxn.txn;
if (algoTxn.type !== algosdk_1.default.TransactionType.keyreg) {
throw new sdk_core_1.InvalidTransactionError(`Invalid Transaction Type: ${algoTxn.type}. Expected ${algosdk_1.default.TransactionType.keyreg}`);
}
if (this.isOnlineKeyRegAlgoSDKTransaction(algoTxn)) {
this.validateFields(algoTxn.voteKey.toString('base64'), algoTxn.selectionKey.toString('base64'), algoTxn.voteFirst, algoTxn.voteLast, algoTxn.voteKeyDilution, algoTxn.stateProofKey && algoTxn.stateProofKey.toString('base64'));
}
}
isNonParticipationKeyRegAlgoSDKTransaction(algoTxn) {
return !!algoTxn.nonParticipation;
}
isNonParticipationKeyRegAccountLibTransaction() {
return !!this._nonParticipation;
}
isOnlineKeyRegAlgoSDKTransaction(algoTxn) {
return !(this.isOfflineKeyRegAlgoSDKTransaction(algoTxn) || this.isNonParticipationKeyRegAlgoSDKTransaction(algoTxn));
}
isOnlineKeyRegAccountLibTransaction() {
return !(this.isOfflineKeyRegAccountLibTransaction() || this.isNonParticipationKeyRegAccountLibTransaction());
}
isOfflineKeyRegAlgoSDKTransaction(algoTxn) {
return (!algoTxn.voteKey &&
!algoTxn.selectionKey &&
!algoTxn.voteFirst &&
!algoTxn.voteLast &&
!algoTxn.voteKeyDilution &&
!algoTxn.stateProofKey &&
!algoTxn.nonParticipation);
}
isOfflineKeyRegAccountLibTransaction() {
return (!this._voteKey &&
!this._selectionKey &&
!this._voteFirst &&
!this._voteLast &&
!this._voteKeyDilution &&
!this._stateProofKey &&
!this._nonParticipation);
}
/** @inheritdoc */
validateTransaction(transaction) {
super.validateTransaction(transaction);
if (this.isOnlineKeyRegAccountLibTransaction()) {
// invalid offline will reach here
this.validateFields(this._voteKey, this._selectionKey, this._voteFirst, this._voteLast, this._voteKeyDilution, this._stateProofKey);
}
else {
// offline or nonparticipation transaction
if (this._voteKey ||
this._selectionKey ||
this._voteFirst ||
this._voteLast ||
this._voteKeyDilution ||
this._stateProofKey) {
throw new sdk_core_1.InvalidTransactionError('VoteKey, SelectionKey, VoteFirst, VoteLast, VoteKeyDilution, StateProofKey fields cannot be set when offline or nonparticipation is set');
}
}
}
validateFields(voteKey, selectionKey, voteFirst, voteLast, voteKeyDilution, stateProofKey) {
const validationResult = txnSchema_1.KeyRegTxnSchema.validate({
voteKey,
selectionKey,
voteFirst,
voteLast,
voteKeyDilution,
stateProofKey,
});
if (validationResult.error) {
throw new sdk_core_1.InvalidTransactionError(`Transaction validation failed: ${validationResult.error.message}`);
}
}
}
exports.KeyRegistrationBuilder = KeyRegistrationBuilder;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5UmVnaXN0cmF0aW9uQnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIva2V5UmVnaXN0cmF0aW9uQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxnRUFBcUM7QUFDckMsc0RBQThCO0FBRTlCLDhDQUEyRTtBQUMzRSw2REFBMEQ7QUFFMUQsMkNBQThDO0FBQzlDLG9EQUE0QjtBQUU1QixNQUFhLHNCQUF1QixTQUFRLHVDQUFrQjtJQVM1RCxZQUFZLFVBQWdDO1FBQzFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE9BQU8sQ0FBQyxHQUFXO1FBQ2pCLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO1FBQ3BCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxZQUFZLENBQUMsR0FBVztRQUN0QixJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQztRQUN6QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsYUFBYSxDQUFDLEdBQVc7UUFDdkIsZUFBSyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQztRQUMxQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsU0FBUyxDQUFDLEtBQWE7UUFDckIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLHNCQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUV4QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxRQUFRLENBQUMsS0FBYTtRQUNwQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUks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UTtZQUNSLGVBQWU7WUFDZixhQUFhO1NBQ2QsQ0FBQyxDQUFDO1FBRUgsSUFBSSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMzQixNQUFNLElBQUksa0NBQXVCLENBQUMsa0NBQWtDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3hHLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUF4VEQsd0RBd1RDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IGFsZ29zZGsgZnJvbSAnYWxnb3Nkayc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlLCBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvciB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgS2V5UmVnVHhuU2NoZW1hIH0gZnJvbSAnLi90eG5TY2hlbWEnO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgS2V5UmVnaXN0cmF0aW9uQnVpbGRlciBleHRlbmRzIFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByb3RlY3RlZCBfdm90ZUtleTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX3NlbGVjdGlvbktleTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX3ZvdGVGaXJzdDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgX3ZvdGVMYXN0OiBudW1iZXI7XG4gIHByb3RlY3RlZCBfdm90ZUtleURpbHV0aW9uOiBudW1iZXI7XG4gIHByb3RlY3RlZCBfbm9uUGFydGljaXBhdGlvbjogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIF9zdGF0ZVByb29mS2V5OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihjb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2b3RlIGtleVxuICAgKlxuICAgKiBAcmV0dXJucyB7S2V5UmVnaXN0cmF0aW9uQnVpbGRlcn0gVGhpcyBLZXkgUmVnaXN0cmF0aW9uIGJ1aWxkZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIHJvb3QgcGFydGljaXBhdGlvbiBwdWJsaWMga2V5LiBTZWUgR2VuZXJhdGUgYSBQYXJ0aWNpcGF0aW9uIEtleSB0byBsZWFybiBtb3JlLlxuICAgKiBodHRwczovL2RldmVsb3Blci5hbGdvcmFuZC5vcmcvZG9jcy9yZWZlcmVuY2UvdHJhbnNhY3Rpb25zLyNrZXktcmVnaXN0cmF0aW9uLXRyYW5zYWN0aW9uXG4gICAqL1xuICB2b3RlS2V5KGtleTogc3RyaW5nKTogS2V5UmVnaXN0cmF0aW9uQnVpbGRlciB7XG4gICAgdGhpcy5fdm90ZUtleSA9IGtleTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzZWxlY3Rpb24ga2V5XG4gICAqXG4gICAqIEByZXR1cm5zIHtLZXlSZWdpc3RyYXRpb25CdWlsZGVyfSBUaGlzIEtleSBSZWdpc3RyYXRpb24gYnVpbGRlci5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgVlJGIHB1YmxpYyBrZXkgZm9yIHRoZSBhY2NvdW50LlxuICAgKiBodHRwczovL2RldmVsb3Blci5hbGdvcmFuZC5vcmcvZG9jcy9yZWZlcmVuY2UvdHJhbnNhY3Rpb25zLyNrZXktcmVnaXN0cmF0aW9uLXRyYW5zYWN0aW9uXG4gICAqL1xuICBzZWxlY3Rpb25LZXkoa2V5OiBzdHJpbmcpOiBLZXlSZWdpc3RyYXRpb25CdWlsZGVyIHtcbiAgICB0aGlzLl9zZWxlY3Rpb25LZXkgPSBrZXk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgc3RhdGVQcm9vZiBrZXlcbiAgICpcbiAgICogQHJldHVybnMge0tleVJlZ2lzdHJhdGlvbkJ1aWxkZXJ9IFRoaXMgS2V5IFJlZ2lzdHJhdGlvbiBidWlsZGVyLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBzdGF0ZXByb29mIGtleS4gU2VlIGNvbnNlbnN1cyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICogaHR0cHM6Ly9kZXZlbG9wZXIuYWxnb3JhbmQub3JnL2RvY3MvZ2V0LWRldGFpbHMvYWxnb3JhbmRfY29uc2Vuc3VzLz9mcm9tX3F1ZXJ5PXN0YXRlI3N0YXRlLXByb29mLWtleXNcbiAgICovXG4gIHN0YXRlUHJvb2ZLZXkoa2V5OiBzdHJpbmcpOiBLZXlSZWdpc3RyYXRpb25CdWlsZGVyIHtcbiAgICBVdGlscy52YWxpZGF0ZUJhc2U2NChrZXkpO1xuICAgIHRoaXMuX3N0YXRlUHJvb2ZLZXkgPSBrZXk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICpTZXRzIHRoZSB2b3RlIGZpcnN0IHJvdW5kXG4gICAqXG4gICAqIEByZXR1cm5zIHtLZXlSZWdpc3RyYXRpb25CdWlsZGVyfSBUaGlzIEtleSBSZWdpc3RyYXRpb24gYnVpbGRlci5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJvdW5kIFRoZSBmaXJzdCByb3VuZCB0aGF0IHRoZSBwYXJ0aWNpcGF0aW9uIGtleSBpcyB2YWxpZC4gTm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggdGhlIEZpcnN0VmFsaWQgcm91bmQgb2YgdGhlIGtleXJlZyB0cmFuc2FjdGlvbi5cbiAgICogaHR0cHM6Ly9kZXZlbG9wZXIuYWxnb3JhbmQub3JnL2RvY3MvcmVmZXJlbmNlL3RyYW5zYWN0aW9ucy8ja2V5LXJlZ2lzdHJhdGlvbi10cmFuc2FjdGlvblxuICAgKi9cbiAgdm90ZUZpcnN0KHJvdW5kOiBudW1iZXIpOiBLZXlSZWdpc3RyYXRpb25CdWlsZGVyIHtcbiAgICB0aGlzLnZhbGlkYXRlVmFsdWUobmV3IEJpZ051bWJlcihyb3VuZCkpO1xuICAgIHRoaXMuX3ZvdGVGaXJzdCA9IHJvdW5kO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdm90ZSBsYXN0IHJvdW5kXG4gICAqXG4gICAqIEByZXR1cm5zIHtLZXlSZWdpc3RyYXRpb25CdWlsZGVyfSBUaGlzIEtleSBSZWdpc3RyYXRpb24gYnVpbGRlci5cbiAgICpcbiAgICogQSByZWNvbW1lbmRlZCByYW5nZSBpcyAzLDAwMCwwMDAgcm91bmRzLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gcm91bmQgTm8gdGhlb3JldGljYWwgbGltaXQuXG4gICAqIGh0dHBzOi8vZGV2ZWxvcGVyLmFsZ29yYW5kLm9yZy9kb2NzL3J1bi1hLW5vZGUvcGFydGljaXBhdGUvZ2VuZXJhdGVfa2V5cy9cbiAgICovXG4gIHZvdGVMYXN0KHJvdW5kOiBudW1iZXIpOiBLZXlSZWdpc3RyYXRpb25CdWlsZGVyIHtcbiAgICB0aGlzLnZhbGlkYXRlVmFsdWUobmV3IEJpZ051bWJlcihyb3VuZCkpO1xuICAgIHRoaXMuX3ZvdGVMYXN0ID0gcm91bmQ7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2b3RlIGtleSBkaWx1dGlvblxuICAgKlxuICAgKiBAcmV0dXJucyB7S2V5UmVnaXN0cmF0aW9uQnVpbGRlcn0gVGhpcyBLZXkgUmVnaXN0cmF0aW9uIGJ1aWxkZXIuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIDEwLDAwMFxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSBbMTAwMDBdLiBUbyByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIHBhcnRpY2lwYXRpb24ga2V5LCBzZXQgdGhlIGtleSBkaWx1dGlvbiB2YWx1ZSB0byByb3VnaGx5IHRoZSBzcXVhcmUgcm9vdCBvZiB0aGUgcmFuZ2UgdGhhdCB0aGUgcGFydGtleSBpcyB2YWxpZCBmb3IuXG4gICAqIGh0dHBzOi8vZGV2ZWxvcGVyLmFsZ29yYW5kLm9yZy9kb2NzL3J1bi1hLW5vZGUvcGFydGljaXBhdGUvZ2VuZXJhdGVfa2V5cy8jZ2VuZXJhdGUtdGhlLXBhcnRpY2lwYXRpb24ta2V5LXdpdGgtZ29hbFxuICAgKiBAcGFyYW0gc2l6ZVxuICAgKi9cbiAgdm90ZUtleURpbHV0aW9uKHNpemUgPSAxMDAwMCk6IEtleVJlZ2lzdHJhdGlvbkJ1aWxkZXIge1xuICAgIHRoaXMudmFsaWRhdGVWYWx1ZShuZXcgQmlnTnVtYmVyKHNpemUpKTtcbiAgICB0aGlzLl92b3RlS2V5RGlsdXRpb24gPSBzaXplO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgbm9uIHBhcnRpY2lwYXRpb24gZmxhZ1xuICAgKlxuICAgKiBAcmV0dXJucyB7S2V5UmVnaXN0cmF0aW9uQnVpbGRlcn0gVGhpcyBLZXkgUmVnaXN0cmF0aW9uIGJ1aWxkZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gbm9uUGFydGljaXBhdGlvbiBBbGwgbmV3IEFsZ29yYW5kIGFjY291bnRzIGFyZSBwYXJ0aWNpcGF0aW5nIGJ5IGRlZmF1bHQuXG4gICAqIFRoaXMgbWVhbnMgdGhhdCB0aGV5IGVhcm4gcmV3YXJkcy4gTWFyayBhbiBhY2NvdW50IG5vbnBhcnRpY2lwYXRpbmcgYnkgc2V0dGluZyB0aGlzIHZhbHVlIHRvIHRydWUgYW5kIHRoaXMgYWNjb3VudFxuICAgKiB3aWxsIG5vIGxvbmdlciBlYXJuIHJld2FyZHMgTkVWRVIuXG4gICAqIGh0dHBzOi8vZGV2ZWxvcGVyLmFsZ29yYW5kLm9yZy9kb2NzL3JlZmVyZW5jZS90cmFuc2FjdGlvbnMvI2tleS1yZWdpc3RyYXRpb24tdHJhbnNhY3Rpb25cbiAgICovXG4gIG5vblBhcnRpY2lwYXRpb24obm9uUGFydGljaXBhdGlvbjogYm9vbGVhbik6IEtleVJlZ2lzdHJhdGlvbkJ1aWxkZXIge1xuICAgIHRoaXMuX25vblBhcnRpY2lwYXRpb24gPSBub25QYXJ0aWNpcGF0aW9uO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRBbGdvVHhuKCk6IGFsZ29zZGsuVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLmlzT2ZmbGluZUtleVJlZ0FjY291bnRMaWJUcmFuc2FjdGlvbigpXG4gICAgICA/IHRoaXMuYnVpbGRPZmZsaW5lS2V5UmVnVHJhbnNhY3Rpb24oKVxuICAgICAgOiB0aGlzLmlzTm9uUGFydGljaXBhdGlvbktleVJlZ0FjY291bnRMaWJUcmFuc2FjdGlvbigpXG4gICAgICA/IHRoaXMuYnVpbGROb25QYXJ0aWNpcGF0aW9uS2V5UmVnVHJhbnNhY3Rpb24oKVxuICAgICAgOiB0aGlzLmJ1aWxkT25saW5lS2V5UmVnVHJhbnNhY3Rpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRPZmZsaW5lS2V5UmVnVHJhbnNhY3Rpb24oKTogYWxnb3Nkay5UcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIGFsZ29zZGsubWFrZUtleVJlZ2lzdHJhdGlvblR4bldpdGhTdWdnZXN0ZWRQYXJhbXMoXG4gICAgICB0aGlzLl9zZW5kZXIsXG4gICAgICB0aGlzLl9ub3RlLFxuICAgICAgdW5kZWZpbmVkLCAvLyB2b3RlS2V5IHBhcmFtXG4gICAgICB1bmRlZmluZWQsIC8vIHNlbGVjdGlvbktleSBwYXJhbVxuICAgICAgdW5kZWZpbmVkLCAvLyB2b3RlRmlyc3QgcGFyYW1cbiAgICAgIHVuZGVmaW5lZCwgLy8gdm90ZUxhc3QgcGFyYW1cbiAgICAgIHVuZGVmaW5lZCwgLy8gdm90ZUtleURpbHV0aW9uIHBhcmFtXG4gICAgICB0aGlzLnN1Z2dlc3RlZFBhcmFtc1xuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkT25saW5lS2V5UmVnVHJhbnNhY3Rpb24oKTogYWxnb3Nkay5UcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIGFsZ29zZGsubWFrZUtleVJlZ2lzdHJhdGlvblR4bldpdGhTdWdnZXN0ZWRQYXJhbXMoXG4gICAgICB0aGlzLl9zZW5kZXIsXG4gICAgICB0aGlzLl9ub3RlLFxuICAgICAgdGhpcy5fdm90ZUtleSxcbiAgICAgIHRoaXMuX3NlbGVjdGlvbktleSxcbiAgICAgIHRoaXMuX3ZvdGVGaXJzdCxcbiAgICAgIHRoaXMuX3ZvdGVMYXN0LFxuICAgICAgdGhpcy5fdm90ZUtleURpbHV0aW9uLFxuICAgICAgdGhpcy5zdWdnZXN0ZWRQYXJhbXMsXG4gICAgICB1bmRlZmluZWQsIC8vIHJlS2V5VG8gcGFyYW1cbiAgICAgIHVuZGVmaW5lZCwgLy8gbm9uUGFydGljaXBhdGlvbiBwYXJhbVxuICAgICAgdGhpcy5fc3RhdGVQcm9vZktleVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkTm9uUGFydGljaXBhdGlvbktleVJlZ1RyYW5zYWN0aW9uKCk6IGFsZ29zZGsuVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiBhbGdvc2RrLm1ha2VLZXlSZWdpc3RyYXRpb25UeG5XaXRoU3VnZ2VzdGVkUGFyYW1zKFxuICAgICAgdGhpcy5fc2VuZGVyLFxuICAgICAgdGhpcy5fbm90ZSxcbiAgICAgIHVuZGVmaW5lZCwgLy8gdm90ZUtleSBwYXJhbVxuICAgICAgdW5kZWZpbmVkLCAvLyBzZWxlY3Rpb25LZXkgcGFyYW1cbiAgICAgIHVuZGVmaW5lZCwgLy8gdm90ZUZpcnN0IHBhcmFtXG4gICAgICB1bmRlZmluZWQsIC8vIHZvdGVMYXN0IHBhcmFtXG4gICAgICB1bmRlZmluZWQsIC8vIHZvdGVLZXlEaWx1dGlvbiBwYXJhbVxuICAgICAgdGhpcy5zdWdnZXN0ZWRQYXJhbXMsXG4gICAgICB0aGlzLl9yZUtleVRvLFxuICAgICAgdHJ1ZSAvLyBub25QYXJ0aWNpcGF0aW9uIHBhcmFtXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb25UeXBlKCk6IFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbjtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgZnJvbUltcGxlbWVudGF0aW9uKHJhd1RyYW5zYWN0aW9uOiBVaW50OEFycmF5IHwgc3RyaW5nKTogVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IHR4ID0gc3VwZXIuZnJvbUltcGxlbWVudGF0aW9uKHJhd1RyYW5zYWN0aW9uKTtcbiAgICBjb25zdCBhbGdvVHhuID0gdHguZ2V0QWxnb1RyYW5zYWN0aW9uKCk7XG5cbiAgICBpZiAoYWxnb1R4bikge1xuICAgICAgaWYgKHRoaXMuaXNOb25QYXJ0aWNpcGF0aW9uS2V5UmVnQWxnb1NES1RyYW5zYWN0aW9uKGFsZ29UeG4pKSB7XG4gICAgICAgIHRoaXMubm9uUGFydGljaXBhdGlvbighIWFsZ29UeG4ubm9uUGFydGljaXBhdGlvbik7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNPbmxpbmVLZXlSZWdBbGdvU0RLVHJhbnNhY3Rpb24oYWxnb1R4bikpIHtcbiAgICAgICAgdGhpcy52b3RlS2V5KGFsZ29UeG4udm90ZUtleS50b1N0cmluZygnYmFzZTY0JykpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbktleShhbGdvVHhuLnNlbGVjdGlvbktleS50b1N0cmluZygnYmFzZTY0JykpO1xuICAgICAgICB0aGlzLnZvdGVGaXJzdChhbGdvVHhuLnZvdGVGaXJzdCk7XG4gICAgICAgIHRoaXMudm90ZUxhc3QoYWxnb1R4bi52b3RlTGFzdCk7XG4gICAgICAgIHRoaXMudm90ZUtleURpbHV0aW9uKGFsZ29UeG4udm90ZUtleURpbHV0aW9uKTtcbiAgICAgICAgaWYgKGFsZ29UeG4uc3RhdGVQcm9vZktleSkge1xuICAgICAgICAgIHRoaXMuc3RhdGVQcm9vZktleShhbGdvVHhuLnN0YXRlUHJvb2ZLZXkudG9TdHJpbmcoJ2Jhc2U2NCcpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHg7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogVWludDhBcnJheSB8IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGRlY29kZVR4biA9IFV0aWxzLmRlY29kZUFsZ29UeG4ocmF3VHJhbnNhY3Rpb24pO1xuICAgIGNvbnN0IGFsZ29UeG4gPSBkZWNvZGVUeG4udHhuO1xuICAgIGlmIChhbGdvVHhuLnR5cGUgIT09IGFsZ29zZGsuVHJhbnNhY3Rpb25UeXBlLmtleXJlZykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgSW52YWxpZCBUcmFuc2FjdGlvbiBUeXBlOiAke2FsZ29UeG4udHlwZX0uIEV4cGVjdGVkICR7YWxnb3Nkay5UcmFuc2FjdGlvblR5cGUua2V5cmVnfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNPbmxpbmVLZXlSZWdBbGdvU0RLVHJhbnNhY3Rpb24oYWxnb1R4bikpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVGaWVsZHMoXG4gICAgICAgIGFsZ29UeG4udm90ZUtleS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgICAgIGFsZ29UeG4uc2VsZWN0aW9uS2V5LnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgICAgYWxnb1R4bi52b3RlRmlyc3QsXG4gICAgICAgIGFsZ29UeG4udm90ZUxhc3QsXG4gICAgICAgIGFsZ29UeG4udm90ZUtleURpbHV0aW9uLFxuICAgICAgICBhbGdvVHhuLnN0YXRlUHJvb2ZLZXkgJiYgYWxnb1R4bi5zdGF0ZVByb29mS2V5LnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzTm9uUGFydGljaXBhdGlvbktleVJlZ0FsZ29TREtUcmFuc2FjdGlvbihhbGdvVHhuOiBhbGdvc2RrLlRyYW5zYWN0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhYWxnb1R4bi5ub25QYXJ0aWNpcGF0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBpc05vblBhcnRpY2lwYXRpb25LZXlSZWdBY2NvdW50TGliVHJhbnNhY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5fbm9uUGFydGljaXBhdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgaXNPbmxpbmVLZXlSZWdBbGdvU0RLVHJhbnNhY3Rpb24oYWxnb1R4bjogYWxnb3Nkay5UcmFuc2FjdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhKFxuICAgICAgdGhpcy5pc09mZmxpbmVLZXlSZWdBbGdvU0RLVHJhbnNhY3Rpb24oYWxnb1R4bikgfHwgdGhpcy5pc05vblBhcnRpY2lwYXRpb25LZXlSZWdBbGdvU0RLVHJhbnNhY3Rpb24oYWxnb1R4bilcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpc09ubGluZUtleVJlZ0FjY291bnRMaWJUcmFuc2FjdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISh0aGlzLmlzT2ZmbGluZUtleVJlZ0FjY291bnRMaWJUcmFuc2FjdGlvbigpIHx8IHRoaXMuaXNOb25QYXJ0aWNpcGF0aW9uS2V5UmVnQWNjb3VudExpYlRyYW5zYWN0aW9uKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc09mZmxpbmVLZXlSZWdBbGdvU0RLVHJhbnNhY3Rpb24oYWxnb1R4bjogYWxnb3Nkay5UcmFuc2FjdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAhYWxnb1R4bi52b3RlS2V5ICYmXG4gICAgICAhYWxnb1R4bi5zZWxlY3Rpb25LZXkgJiZcbiAgICAgICFhbGdvVHhuLnZvdGVGaXJzdCAmJlxuICAgICAgIWFsZ29UeG4udm90ZUxhc3QgJiZcbiAgICAgICFhbGdvVHhuLnZvdGVLZXlEaWx1dGlvbiAmJlxuICAgICAgIWFsZ29UeG4uc3RhdGVQcm9vZktleSAmJlxuICAgICAgIWFsZ29UeG4ubm9uUGFydGljaXBhdGlvblxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGlzT2ZmbGluZUtleVJlZ0FjY291bnRMaWJUcmFuc2FjdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgIXRoaXMuX3ZvdGVLZXkgJiZcbiAgICAgICF0aGlzLl9zZWxlY3Rpb25LZXkgJiZcbiAgICAgICF0aGlzLl92b3RlRmlyc3QgJiZcbiAgICAgICF0aGlzLl92b3RlTGFzdCAmJlxuICAgICAgIXRoaXMuX3ZvdGVLZXlEaWx1dGlvbiAmJlxuICAgICAgIXRoaXMuX3N0YXRlUHJvb2ZLZXkgJiZcbiAgICAgICF0aGlzLl9ub25QYXJ0aWNpcGF0aW9uXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIHN1cGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pO1xuICAgIGlmICh0aGlzLmlzT25saW5lS2V5UmVnQWNjb3VudExpYlRyYW5zYWN0aW9uKCkpIHtcbiAgICAgIC8vIGludmFsaWQgb2ZmbGluZSB3aWxsIHJlYWNoIGhlcmVcbiAgICAgIHRoaXMudmFsaWRhdGVGaWVsZHMoXG4gICAgICAgIHRoaXMuX3ZvdGVLZXksXG4gICAgICAgIHRoaXMuX3NlbGVjdGlvbktleSxcbiAgICAgICAgdGhpcy5fdm90ZUZpcnN0LFxuICAgICAgICB0aGlzLl92b3RlTGFzdCxcbiAgICAgICAgdGhpcy5fdm90ZUtleURpbHV0aW9uLFxuICAgICAgICB0aGlzLl9zdGF0ZVByb29mS2V5XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvZmZsaW5lIG9yIG5vbnBhcnRpY2lwYXRpb24gdHJhbnNhY3Rpb25cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fdm90ZUtleSB8fFxuICAgICAgICB0aGlzLl9zZWxlY3Rpb25LZXkgfHxcbiAgICAgICAgdGhpcy5fdm90ZUZpcnN0IHx8XG4gICAgICAgIHRoaXMuX3ZvdGVMYXN0IHx8XG4gICAgICAgIHRoaXMuX3ZvdGVLZXlEaWx1dGlvbiB8fFxuICAgICAgICB0aGlzLl9zdGF0ZVByb29mS2V5XG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAgICdWb3RlS2V5LCBTZWxlY3Rpb25LZXksIFZvdGVGaXJzdCwgVm90ZUxhc3QsIFZvdGVLZXlEaWx1dGlvbiwgU3RhdGVQcm9vZktleSBmaWVsZHMgY2Fubm90IGJlIHNldCB3aGVuIG9mZmxpbmUgb3Igbm9ucGFydGljaXBhdGlvbiBpcyBzZXQnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUZpZWxkcyhcbiAgICB2b3RlS2V5OiBzdHJpbmcsXG4gICAgc2VsZWN0aW9uS2V5OiBzdHJpbmcsXG4gICAgdm90ZUZpcnN0OiBudW1iZXIsXG4gICAgdm90ZUxhc3Q6IG51bWJlcixcbiAgICB2b3RlS2V5RGlsdXRpb246IG51bWJlcixcbiAgICBzdGF0ZVByb29mS2V5Pzogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBLZXlSZWdUeG5TY2hlbWEudmFsaWRhdGUoe1xuICAgICAgdm90ZUtleSxcbiAgICAgIHNlbGVjdGlvbktleSxcbiAgICAgIHZvdGVGaXJzdCxcbiAgICAgIHZvdGVMYXN0LFxuICAgICAgdm90ZUtleURpbHV0aW9uLFxuICAgICAgc3RhdGVQcm9vZktleSxcbiAgICB9KTtcblxuICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0LmVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoYFRyYW5zYWN0aW9uIHZhbGlkYXRpb24gZmFpbGVkOiAke3ZhbGlkYXRpb25SZXN1bHQuZXJyb3IubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!