PHP WebShell

Текущая директория: /opt/BitGoJS/modules/abstract-lightning/dist/src/wallet

Просмотр файла: lightning.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;
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.LightningWallet = void 0;
exports.getLightningKeychain = getLightningKeychain;
exports.getLightningAuthKeychains = getLightningAuthKeychains;
const sdkcore = __importStar(require("@bitgo/sdk-core"));
const sdk_core_1 = require("@bitgo/sdk-core");
const t = __importStar(require("io-ts"));
const lightning_1 = require("../lightning");
const codecs_1 = require("../codecs");
const public_types_1 = require("@bitgo/public-types");
/**
 * Get the lightning keychain for the given wallet.
 */
async function getLightningKeychain(wallet) {
    const coin = wallet.baseCoin;
    if (coin.getFamily() !== 'lnbtc') {
        throw new Error(`Invalid coin to get lightning wallet key: ${coin.getFamily()}`);
    }
    const keyIds = wallet.keyIds();
    if (keyIds.length !== 1) {
        throw new Error(`Invalid number of key in lightning wallet: ${keyIds.length}`);
    }
    const keychain = await coin.keychains().get({ id: keyIds[0] });
    return sdkcore.decodeOrElse(codecs_1.LightningKeychain.name, codecs_1.LightningKeychain, keychain, (_) => {
        throw new Error(`Invalid user key`);
    });
}
/**
 * Get the lightning auth keychains for the given wallet.
 */
async function getLightningAuthKeychains(wallet) {
    const coin = wallet.baseCoin;
    if (coin.getFamily() !== 'lnbtc') {
        throw new Error(`Invalid coin to get lightning wallet auth keys: ${coin.getFamily()}`);
    }
    const authKeyIds = wallet.coinSpecific()?.keys;
    if (authKeyIds?.length !== 2) {
        throw new Error(`Invalid number of auth keys in lightning wallet: ${authKeyIds?.length}`);
    }
    const keychains = await Promise.all(authKeyIds.map((id) => coin.keychains().get({ id })));
    const authKeychains = keychains.map((keychain) => {
        return sdkcore.decodeOrElse(codecs_1.LightningAuthKeychain.name, codecs_1.LightningAuthKeychain, keychain, (_) => {
            // DON'T throw errors from decodeOrElse. It could leak sensitive information.
            throw new Error(`Invalid lightning auth key: ${keychain?.id}`);
        });
    });
    const [userAuthKey, nodeAuthKey] = ['userAuth', 'nodeAuth'].map((purpose) => {
        const keychain = authKeychains.find((k) => (0, lightning_1.unwrapLightningCoinSpecific)(k.coinSpecific, coin.getChain()).purpose === purpose);
        if (!keychain) {
            throw new Error(`Missing ${purpose} key`);
        }
        return keychain;
    });
    return { userAuthKey, nodeAuthKey };
}
class LightningWallet {
    constructor(wallet) {
        const coin = wallet.baseCoin;
        if (coin.getFamily() !== 'lnbtc') {
            throw new Error(`Invalid coin for lightning wallet: ${coin.getFamily()}`);
        }
        this.wallet = wallet;
    }
    async createInvoice(params) {
        const createInvoiceResponse = await this.wallet.bitgo
            .post(this.wallet.bitgo.url(`/wallet/${this.wallet.id()}/lightning/invoice`, 2))
            .send(t.exact(codecs_1.CreateInvoiceBody).encode(params))
            .result();
        return sdkcore.decodeOrElse(codecs_1.Invoice.name, codecs_1.Invoice, createInvoiceResponse, (error) => {
            // DON'T throw errors from decodeOrElse. It could leak sensitive information.
            throw new Error(`Invalid create invoice response ${error}`);
        });
    }
    async getInvoice(paymentHash) {
        const response = await this.wallet.bitgo
            .get(this.wallet.bitgo.url(`/wallet/${this.wallet.id()}/lightning/invoice/${paymentHash}`, 2))
            .result();
        return (0, sdk_core_1.decodeOrElse)(codecs_1.InvoiceInfo.name, codecs_1.InvoiceInfo, response, (error) => {
            throw new Error(`Invalid get invoice response ${error}`);
        });
    }
    async listInvoices(params) {
        const returnCodec = t.array(codecs_1.InvoiceInfo);
        const createInvoiceResponse = await this.wallet.bitgo
            .get(this.wallet.bitgo.url(`/wallet/${this.wallet.id()}/lightning/invoice`, 2))
            .query(codecs_1.InvoiceQuery.encode(params))
            .result();
        return sdkcore.decodeOrElse(returnCodec.name, returnCodec, createInvoiceResponse, (error) => {
            throw new Error(`Invalid list invoices response ${error}`);
        });
    }
    async payInvoice(params) {
        const reqId = new sdk_core_1.RequestTracer();
        this.wallet.bitgo.setRequestTracer(reqId);
        const { userAuthKey } = await getLightningAuthKeychains(this.wallet);
        const userAuthKeyEncryptedPrv = userAuthKey.encryptedPrv;
        if (!userAuthKeyEncryptedPrv) {
            throw new Error(`user auth key is missing encrypted private key`);
        }
        const signature = (0, lightning_1.createMessageSignature)(t.exact(public_types_1.LightningPaymentRequest).encode(params), this.wallet.bitgo.decrypt({ password: params.passphrase, input: userAuthKeyEncryptedPrv }));
        const paymentIntent = {
            intent: {
                comment: params.comment,
                sequenceId: params.sequenceId,
                intentType: 'payment',
                signedRequest: {
                    invoice: params.invoice,
                    amountMsat: params.amountMsat,
                    feeLimitMsat: params.feeLimitMsat,
                    feeLimitRatio: params.feeLimitRatio,
                },
                signature,
            },
        };
        const transactionRequestCreate = (await this.wallet.bitgo
            .post(this.wallet.bitgo.url('/wallet/' + this.wallet.id() + '/txrequests', 2))
            .send(t.type({ intent: public_types_1.LightningPaymentIntent }).encode(paymentIntent))
            .result());
        if (transactionRequestCreate.state === 'pendingApproval') {
            const pendingApprovals = new sdk_core_1.PendingApprovals(this.wallet.bitgo, this.wallet.baseCoin);
            const pendingApproval = await pendingApprovals.get({ id: transactionRequestCreate.pendingApprovalId });
            return {
                pendingApproval: pendingApproval.toJSON(),
                txRequestId: transactionRequestCreate.txRequestId,
                txRequestState: transactionRequestCreate.state,
            };
        }
        const transactionRequestSend = await sdk_core_1.commonTssMethods.sendTxRequest(this.wallet.bitgo, this.wallet.id(), transactionRequestCreate.txRequestId, sdk_core_1.RequestType.tx, reqId);
        const coinSpecific = transactionRequestSend.transactions?.[0]?.unsignedTx?.coinSpecific;
        let transfer;
        if (coinSpecific && coinSpecific.paymentHash && typeof coinSpecific.paymentHash === 'string') {
            transfer = await this.wallet.getTransfer({ id: coinSpecific.paymentHash });
        }
        return {
            txRequestId: transactionRequestCreate.txRequestId,
            txRequestState: transactionRequestSend.state,
            paymentStatus: coinSpecific
                ? t.exact(codecs_1.LndCreatePaymentResponse).encode(coinSpecific)
                : undefined,
            transfer,
        };
    }
    async withdrawOnchain(params) {
        const reqId = new sdk_core_1.RequestTracer();
        this.wallet.bitgo.setRequestTracer(reqId);
        const paymentIntent = {
            intent: {
                onchainRequest: {
                    recipients: params.recipients,
                    satsPerVbyte: params.satsPerVbyte,
                },
                intentType: 'payment',
            },
        };
        const transactionRequestCreate = (await this.wallet.bitgo
            .post(this.wallet.bitgo.url('/wallet/' + this.wallet.id() + '/txrequests', 2))
            .send(t.type({ intent: public_types_1.LightningPaymentIntent }).encode(paymentIntent))
            .result());
        if (transactionRequestCreate.state === 'pendingApproval') {
            const pendingApprovals = new sdk_core_1.PendingApprovals(this.wallet.bitgo, this.wallet.baseCoin);
            const pendingApproval = await pendingApprovals.get({ id: transactionRequestCreate.pendingApprovalId });
            return {
                pendingApproval: pendingApproval.toJSON(),
                txRequestId: transactionRequestCreate.txRequestId,
                txRequestState: transactionRequestCreate.state,
            };
        }
        const transactionRequestSend = await sdk_core_1.commonTssMethods.sendTxRequest(this.wallet.bitgo, this.wallet.id(), transactionRequestCreate.txRequestId, sdk_core_1.RequestType.tx, reqId);
        return {
            txRequestId: transactionRequestCreate.txRequestId,
            txRequestState: transactionRequestSend.state,
        };
    }
    async getPayment(paymentHash) {
        const response = await this.wallet.bitgo
            .get(this.wallet.bitgo.url(`/wallet/${this.wallet.id()}/lightning/payment/${paymentHash}`, 2))
            .result();
        return (0, sdk_core_1.decodeOrElse)(codecs_1.PaymentInfo.name, codecs_1.PaymentInfo, response, (error) => {
            throw new Error(`Invalid payment response: ${error}`);
        });
    }
    async listPayments(params) {
        const response = await this.wallet.bitgo
            .get(this.wallet.bitgo.url(`/wallet/${this.wallet.id()}/lightning/payment`, 2))
            .query(codecs_1.PaymentQuery.encode(params))
            .result();
        return (0, sdk_core_1.decodeOrElse)(t.array(codecs_1.PaymentInfo).name, t.array(codecs_1.PaymentInfo), response, (error) => {
            throw new Error(`Invalid payment list response: ${error}`);
        });
    }
    async getTransaction(txId) {
        const response = await this.wallet.bitgo
            .get(this.wallet.bitgo.url(`/wallet/${this.wallet.id()}/lightning/transaction/${txId}`, 2))
            .result();
        return (0, sdk_core_1.decodeOrElse)(codecs_1.Transaction.name, codecs_1.Transaction, response, (error) => {
            throw new Error(`Invalid transaction response: ${error}`);
        });
    }
    async listTransactions(params) {
        const response = await this.wallet.bitgo
            .get(this.wallet.bitgo.url(`/wallet/${this.wallet.id()}/lightning/transaction`, 2))
            .query(codecs_1.TransactionQuery.encode(params))
            .result();
        return (0, sdk_core_1.decodeOrElse)(t.array(codecs_1.Transaction).name, t.array(codecs_1.Transaction), response, (error) => {
            throw new Error(`Invalid transaction list response: ${error}`);
        });
    }
}
exports.LightningWallet = LightningWallet;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRuaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3dhbGxldC9saWdodG5pbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUVBLG9EQWFDO0FBS0QsOERBOEJDO0FBdkhELHlEQUEyQztBQUMzQyw4Q0FTeUI7QUFDekIseUNBQTJCO0FBQzNCLDRDQUFtRjtBQUNuRixzQ0FlbUI7QUFDbkIsc0RBQXNGO0FBdUN0Rjs7R0FFRztBQUNJLEtBQUssVUFBVSxvQkFBb0IsQ0FBQyxNQUF1QjtJQUNoRSxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQzdCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLE9BQU8sRUFBRSxDQUFDO1FBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUMvQixJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUNELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQy9ELE9BQU8sT0FBTyxDQUFDLFlBQVksQ0FBQywwQkFBaUIsQ0FBQyxJQUFJLEVBQUUsMEJBQWlCLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDckYsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3RDLENBQUMs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SyxDQUFDLG9CQUFXLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN2RixNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBN0xELDBDQTZMQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHNka2NvcmUgZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7XG4gIFBlbmRpbmdBcHByb3ZhbERhdGEsXG4gIFBlbmRpbmdBcHByb3ZhbHMsXG4gIFJlcXVlc3RUcmFjZXIsXG4gIFJlcXVlc3RUeXBlLFxuICBUeFJlcXVlc3QsXG4gIGNvbW1vblRzc01ldGhvZHMsXG4gIFR4UmVxdWVzdFN0YXRlLFxuICBkZWNvZGVPckVsc2UsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgKiBhcyB0IGZyb20gJ2lvLXRzJztcbmltcG9ydCB7IGNyZWF0ZU1lc3NhZ2VTaWduYXR1cmUsIHVud3JhcExpZ2h0bmluZ0NvaW5TcGVjaWZpYyB9IGZyb20gJy4uL2xpZ2h0bmluZyc7XG5pbXBvcnQge1xuICBDcmVhdGVJbnZvaWNlQm9keSxcbiAgSW52b2ljZSxcbiAgSW52b2ljZUluZm8sXG4gIEludm9pY2VRdWVyeSxcbiAgTGlnaHRuaW5nQXV0aEtleWNoYWluLFxuICBMaWdodG5pbmdLZXljaGFpbixcbiAgTG5kQ3JlYXRlUGF5bWVudFJlc3BvbnNlLFxuICBTdWJtaXRQYXltZW50UGFyYW1zLFxuICBUcmFuc2FjdGlvbixcbiAgVHJhbnNhY3Rpb25RdWVyeSxcbiAgUGF5bWVudEluZm8sXG4gIFBheW1lbnRRdWVyeSxcbiAgTGlnaHRuaW5nT25jaGFpbldpdGhkcmF3UGFyYW1zLFxuICBMaWdodG5pbmdPbmNoYWluV2l0aGRyYXdSZXNwb25zZSxcbn0gZnJvbSAnLi4vY29kZWNzJztcbmltcG9ydCB7IExpZ2h0bmluZ1BheW1lbnRJbnRlbnQsIExpZ2h0bmluZ1BheW1lbnRSZXF1ZXN0IH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5cbmV4cG9ydCB0eXBlIFBheUludm9pY2VSZXNwb25zZSA9IHtcbiAgLyoqXG4gICAqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcGF5bWVudCByZXF1ZXN0IHN1Ym1pdHRlZCB0byBCaXRHby5cbiAgICovXG4gIHR4UmVxdWVzdElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFN0YXR1cyBvZiB0aGUgcGF5bWVudCByZXF1ZXN0IHN1Ym1pc3Npb24gdG8gQml0R28uXG4gICAqIC0gYCdkZWxpdmVyZWQnYDogU3VjY2Vzc2Z1bGx5IHJlY2VpdmVkIGJ5IEJpdEdvLCBidXQgbWF5IG9yIG1heSBub3QgaGF2ZSBiZWVuIHNlbnQgdG8gdGhlIExpZ2h0bmluZyBOZXR3b3JrIHlldC5cbiAgICogLSBGb3IgdGhlIGFjdHVhbCBwYXltZW50IHN0YXR1cywgcmVmZXIgdG8gYHBheW1lbnRTdGF0dXNgIGFuZCB0cmFjayBgdHJhbnNmZXJgLlxuICAgKi9cbiAgdHhSZXF1ZXN0U3RhdGU6IFR4UmVxdWVzdFN0YXRlO1xuXG4gIC8qKlxuICAgKiBQZW5kaW5nIGFwcHJvdmFsIGRldGFpbHMsIGlmIGFwcGxpY2FibGUuXG4gICAqIC0gSWYgcHJlc2VudCwgdGhlIHBheW1lbnQgaGFzIG5vdCBiZWVuIGluaXRpYXRlZCB5ZXQuXG4gICAqL1xuICBwZW5kaW5nQXBwcm92YWw/OiBQZW5kaW5nQXBwcm92YWxEYXRhO1xuXG4gIC8qKlxuICAgKiBDdXJyZW50IHNuYXBzaG90IG9mIHBheW1lbnQgc3RhdHVzIChpZiBhdmFpbGFibGUpLlxuICAgKiAtICoqYCdpbl9mbGlnaHQnYCoqOiBQYXltZW50IGlzIGluIHByb2dyZXNzLlxuICAgKiAtICoqYCdzZXR0bGVkJ2AqKjogUGF5bWVudCB3YXMgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZC5cbiAgICogLSAqKmAnZmFpbGVkJ2AqKjogUGF5bWVudCBmYWlsZWQuXG4gICAqIFRoaXMgZmllbGQgaXMgYWJzZW50IGlmIGFwcHJvdmFsIGlzIHJlcXVpcmVkIGJlZm9yZSBwcm9jZXNzaW5nLlxuICAgKi9cbiAgcGF5bWVudFN0YXR1cz86IExuZENyZWF0ZVBheW1lbnRSZXNwb25zZTtcblxuICAvKipcbiAgICogTGF0ZXN0IHRyYW5zZmVyIGRldGFpbHMgZm9yIHRoaXMgcGF5bWVudCByZXF1ZXN0IChpZiBhdmFpbGFibGUpLlxuICAgKiAtIFByb3ZpZGVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB0cmFuc2Zlci5cbiAgICogLSBUbyB0cmFjayB0aGUgZmluYWwgcGF5bWVudCBzdGF0dXMsIG1vbml0b3IgYHRyYW5zZmVyYCBhc3luY2hyb25vdXNseS5cbiAgICogVGhpcyBmaWVsZCBpcyBhYnNlbnQgaWYgYXBwcm92YWwgaXMgcmVxdWlyZWQgYmVmb3JlIHByb2Nlc3NpbmcuXG4gICAqL1xuICB0cmFuc2Zlcj86IGFueTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBsaWdodG5pbmcga2V5Y2hhaW4gZm9yIHRoZSBnaXZlbiB3YWxsZXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRMaWdodG5pbmdLZXljaGFpbih3YWxsZXQ6IHNka2NvcmUuSVdhbGxldCk6IFByb21pc2U8TGlnaHRuaW5nS2V5Y2hhaW4+IHtcbiAgY29uc3QgY29pbiA9IHdhbGxldC5iYXNlQ29pbjtcbiAgaWYgKGNvaW4uZ2V0RmFtaWx5KCkgIT09ICdsbmJ0YycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29pbiB0byBnZXQgbGlnaHRuaW5nIHdhbGxldCBrZXk6ICR7Y29pbi5nZXRGYW1pbHkoKX1gKTtcbiAgfVxuICBjb25zdCBrZXlJZHMgPSB3YWxsZXQua2V5SWRzKCk7XG4gIGlmIChrZXlJZHMubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG51bWJlciBvZiBrZXkgaW4gbGlnaHRuaW5nIHdhbGxldDogJHtrZXlJZHMubGVuZ3RofWApO1xuICB9XG4gIGNvbnN0IGtleWNoYWluID0gYXdhaXQgY29pbi5rZXljaGFpbnMoKS5nZXQoeyBpZDoga2V5SWRzWzBdIH0pO1xuICByZXR1cm4gc2RrY29yZS5kZWNvZGVPckVsc2UoTGlnaHRuaW5nS2V5Y2hhaW4ubmFtZSwgTGlnaHRuaW5nS2V5Y2hhaW4sIGtleWNoYWluLCAoXykgPT4ge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB1c2VyIGtleWApO1xuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGxpZ2h0bmluZyBhdXRoIGtleWNoYWlucyBmb3IgdGhlIGdpdmVuIHdhbGxldC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldExpZ2h0bmluZ0F1dGhLZXljaGFpbnMod2FsbGV0OiBzZGtjb3JlLklXYWxsZXQpOiBQcm9taXNlPHtcbiAgdXNlckF1dGhLZXk6IExpZ2h0bmluZ0F1dGhLZXljaGFpbjtcbiAgbm9kZUF1dGhLZXk6IExpZ2h0bmluZ0F1dGhLZXljaGFpbjtcbn0+IHtcbiAgY29uc3QgY29pbiA9IHdhbGxldC5iYXNlQ29pbjtcbiAgaWYgKGNvaW4uZ2V0RmFtaWx5KCkgIT09ICdsbmJ0YycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29pbiB0byBnZXQgbGlnaHRuaW5nIHdhbGxldCBhdXRoIGtleXM6ICR7Y29pbi5nZXRGYW1pbHkoKX1gKTtcbiAgfVxuICBjb25zdCBhdXRoS2V5SWRzID0gd2FsbGV0LmNvaW5TcGVjaWZpYygpPy5rZXlzO1xuICBpZiAoYXV0aEtleUlkcz8ubGVuZ3RoICE9PSAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG51bWJlciBvZiBhdXRoIGtleXMgaW4gbGlnaHRuaW5nIHdhbGxldDogJHthdXRoS2V5SWRzPy5sZW5ndGh9YCk7XG4gIH1cbiAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgUHJvbWlzZS5hbGwoYXV0aEtleUlkcy5tYXAoKGlkKSA9PiBjb2luLmtleWNoYWlucygpLmdldCh7IGlkIH0pKSk7XG4gIGNvbnN0IGF1dGhLZXljaGFpbnMgPSBrZXljaGFpbnMubWFwKChrZXljaGFpbikgPT4ge1xuICAgIHJldHVybiBzZGtjb3JlLmRlY29kZU9yRWxzZShMaWdodG5pbmdBdXRoS2V5Y2hhaW4ubmFtZSwgTGlnaHRuaW5nQXV0aEtleWNoYWluLCBrZXljaGFpbiwgKF8pID0+IHtcbiAgICAgIC8vIERPTidUIHRocm93IGVycm9ycyBmcm9tIGRlY29kZU9yRWxzZS4gSXQgY291bGQgbGVhayBzZW5zaXRpdmUgaW5mb3JtYXRpb24uXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbGlnaHRuaW5nIGF1dGgga2V5OiAke2tleWNoYWluPy5pZH1gKTtcbiAgICB9KTtcbiAgfSk7XG4gIGNvbnN0IFt1c2VyQXV0aEtleSwgbm9kZUF1dGhLZXldID0gKFsndXNlckF1dGgnLCAnbm9kZUF1dGgnXSBhcyBjb25zdCkubWFwKChwdXJwb3NlKSA9PiB7XG4gICAgY29uc3Qga2V5Y2hhaW4gPSBhdXRoS2V5Y2hhaW5zLmZpbmQoXG4gICAgICAoaykgPT4gdW53cmFwTGlnaHRuaW5nQ29pblNwZWNpZmljKGsuY29pblNwZWNpZmljLCBjb2luLmdldENoYWluKCkpLnB1cnBvc2UgPT09IHB1cnBvc2VcbiAgICApO1xuICAgIGlmICgha2V5Y2hhaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyAke3B1cnBvc2V9IGtleWApO1xuICAgIH1cbiAgICByZXR1cm4ga2V5Y2hhaW47XG4gIH0pO1xuXG4gIHJldHVybiB7IHVzZXJBdXRoS2V5LCBub2RlQXV0aEtleSB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElMaWdodG5pbmdXYWxsZXQge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIGxpZ2h0bmluZyBpbnZvaWNlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJhbXMgSW52b2ljZSBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSB7YmlnaW50fSBwYXJhbXMudmFsdWVNc2F0IFRoZSB2YWx1ZSBvZiB0aGUgaW52b2ljZSBpbiBtaWxsaXNhdG9zaGlzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGFyYW1zLm1lbW9dIEEgbWVtbyBvciBkZXNjcmlwdGlvbiBmb3IgdGhlIGludm9pY2VcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtwYXJhbXMuZXhwaXJ5XSBUaGUgZXhwaXJ5IHRpbWUgb2YgdGhlIGludm9pY2UgaW4gc2Vjb25kc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxJbnZvaWNlPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNyZWF0ZWQgaW52b2ljZVxuICAgKi9cbiAgY3JlYXRlSW52b2ljZShwYXJhbXM6IENyZWF0ZUludm9pY2VCb2R5KTogUHJvbWlzZTxJbnZvaWNlPjtcbiAgLyoqXG4gICAqIEdldCBpbnZvaWNlIGRldGFpbHMgYnkgcGF5bWVudCBoYXNoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXltZW50SGFzaCAtIFBheW1lbnQgaGFzaCB0byBsb29rdXBcbiAgICogQHJldHVybnMge1Byb21pc2U8SW52b2ljZUluZm8+fSBJbnZvaWNlIGRldGFpbHNcbiAgICogQHRocm93cyB7SW52YWxpZFBheW1lbnRIYXNofSBXaGVuIHBheW1lbnQgaGFzaCBpcyBub3QgdmFsaWRcbiAgICovXG4gIGdldEludm9pY2UocGF5bWVudEhhc2g6IHN0cmluZyk6IFByb21pc2U8SW52b2ljZUluZm8+O1xuICAvKipcbiAgICogTGlzdHMgY3VycmVudCBsaWdodG5pbmcgaW52b2ljZXNcbiAgICogQHBhcmFtIHtJbnZvaWNlUXVlcnl9IHBhcmFtcyBRdWVyeSBwYXJhbWV0ZXJzIGZvciBmaWx0ZXJpbmcgaW52b2ljZXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXJhbXMuc3RhdHVzXSBUaGUgc3RhdHVzIG9mIHRoZSBpbnZvaWNlIChvcGVuLCBzZXR0bGVkLCBjYW5jZWxlZClcbiAgICogQHBhcmFtIHtiaWdpbnR9IFtwYXJhbXMubGltaXRdIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpbnZvaWNlcyB0byByZXR1cm5cbiAgICogQHBhcmFtIHtEYXRlfSBbcGFyYW1zLnN0YXJ0RGF0ZV0gVGhlIHN0YXJ0IGRhdGUgZm9yIHRoZSBxdWVyeVxuICAgKiBAcGFyYW0ge0RhdGV9IFtwYXJhbXMuZW5kRGF0ZV0gVGhlIGVuZCBkYXRlIGZvciB0aGUgcXVlcnlcbiAgICogQHJldHVybnMge1Byb21pc2U8SW52b2ljZUluZm9bXT59IExpc3Qgb2YgaW52b2ljZXNcbiAgICovXG4gIGxpc3RJbnZvaWNlcyhwYXJhbXM6IEludm9pY2VRdWVyeSk6IFByb21pc2U8SW52b2ljZUluZm9bXT47XG5cbiAgLyoqXG4gICAqIFBheSBhIGxpZ2h0bmluZyBpbnZvaWNlXG4gICAqIEBwYXJhbSB7U3VibWl0UGF5bWVudFBhcmFtc30gcGFyYW1zIC0gUGF5bWVudCBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuaW52b2ljZSAtIFRoZSBpbnZvaWNlIHRvIHBheVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmFtb3VudE1zYXQgLSBUaGUgYW1vdW50IHRvIHBheSBpbiBtaWxsaXNhdG9zaGlzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucGFzc3BocmFzZSAtIFRoZSB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhcmFtcy5zZXF1ZW5jZUlkXSAtIE9wdGlvbmFsIHNlcXVlbmNlIElEIGZvciB0aGUgcmVzcGVjdGl2ZSBwYXltZW50IHRyYW5zZmVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGFyYW1zLmNvbW1lbnRdIC0gT3B0aW9uYWwgY29tbWVudCBmb3IgdGhlIHJlc3BlY3RpdmUgcGF5bWVudCB0cmFuc2ZlclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxQYXlJbnZvaWNlUmVzcG9uc2U+fSBQYXltZW50IHJlc3VsdCBjb250YWluaW5nIHRyYW5zYWN0aW9uIHJlcXVlc3QgZGV0YWlscyBhbmQgcGF5bWVudCBzdGF0dXNcbiAgICovXG4gIHBheUludm9pY2UocGFyYW1zOiBTdWJtaXRQYXltZW50UGFyYW1zKTogUHJvbWlzZTxQYXlJbnZvaWNlUmVzcG9uc2U+O1xuXG4gIC8qKlxuICAgKiBPbiBjaGFpbiB3aXRoZHJhd2FsXG4gICAqIEBwYXJhbSB7TGlnaHRuaW5nT25jaGFpbldpdGhkcmF3UGFyYW1zfSBwYXJhbXMgLSBXaXRoZHJhdyBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSB7TGlnaHRuaW5nT25jaGFpblJlY2lwaWVudFtdfSBwYXJhbXMucmVjaXBpZW50cyAtIFRoZSByZWNpcGllbnRzIHRvIHBheVxuICAgKiBAcGFyYW0ge2JpZ2ludH0gcGFyYW1zLnNhdHNQZXJWYnl0ZSAtIFZhbHVlIGZvciBzYXRzIHBlciB2aXJ0dWFsIGJ5dGVcbiAgICogQHJldHVybnMge1Byb21pc2U8TGlnaHRuaW5nT25jaGFpbldpdGhkcmF3UmVzcG9uc2U+fSBXaXRoZHJhdyByZXN1bHQgY29udGFpbmluZyB0cmFuc2FjdGlvbiByZXF1ZXN0IGRldGFpbHMgYW5kIHN0YXR1c1xuICAgKi9cbiAgd2l0aGRyYXdPbmNoYWluKHBhcmFtczogTGlnaHRuaW5nT25jaGFpbldpdGhkcmF3UGFyYW1zKTogUHJvbWlzZTxMaWdodG5pbmdPbmNoYWluV2l0aGRyYXdSZXNwb25zZT47XG4gIC8qKlxuICAgKiBHZXQgcGF5bWVudCBkZXRhaWxzIGJ5IHBheW1lbnQgaGFzaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF5bWVudEhhc2ggLSBQYXltZW50IGhhc2ggdG8gbG9va3VwXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnRJbmZvPn0gUGF5bWVudCBkZXRhaWxzXG4gICAqIEB0aHJvd3Mge0ludmFsaWRQYXltZW50SGFzaH0gV2hlbiBwYXltZW50IGhhc2ggaXMgbm90IHZhbGlkXG4gICAqL1xuICBnZXRQYXltZW50KHBheW1lbnRIYXNoOiBzdHJpbmcpOiBQcm9taXNlPFBheW1lbnRJbmZvPjtcbiAgLyoqXG4gICAqIExpc3QgcGF5bWVudHMgZm9yIGEgd2FsbGV0IHdpdGggb3B0aW9uYWwgZmlsdGVyaW5nXG4gICAqIEBwYXJhbSB7UGF5bWVudFF1ZXJ5fSBwYXJhbXMgUXVlcnkgcGFyYW1ldGVycyBmb3IgZmlsdGVyaW5nIHBheW1lbnRzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGFyYW1zLnN0YXR1c10gVGhlIHN0YXR1cyBvZiB0aGUgcGF5bWVudFxuICAgKiBAcGFyYW0ge2JpZ2ludH0gW3BhcmFtcy5saW1pdF0gVGhlIG1heGltdW0gbnVtYmVyIG9mIHBheW1lbnRzIHRvIHJldHVyblxuICAgKiBAcGFyYW0ge0RhdGV9IFtwYXJhbXMuc3RhcnREYXRlXSBUaGUgc3RhcnQgZGF0ZSBmb3IgdGhlIHF1ZXJ5XG4gICAqIEBwYXJhbSB7RGF0ZX0gW3BhcmFtcy5lbmREYXRlXSBUaGUgZW5kIGRhdGUgZm9yIHRoZSBxdWVyeVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxQYXltZW50SW5mb1tdPn0gTGlzdCBvZiBwYXltZW50c1xuICAgKi9cbiAgbGlzdFBheW1lbnRzKHBhcmFtczogUGF5bWVudFF1ZXJ5KTogUHJvbWlzZTxQYXltZW50SW5mb1tdPjtcbiAgLyoqXG4gICAqIEdldCB0cmFuc2FjdGlvbiBkZXRhaWxzIGJ5IElEXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eElkIC0gVHJhbnNhY3Rpb24gSUQgdG8gbG9va3VwXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFRyYW5zYWN0aW9uPn0gVHJhbnNhY3Rpb24gZGV0YWlsc1xuICAgKiBAdGhyb3dzIHtJbnZhbGlkVHhJZH0gV2hlbiB0cmFuc2FjdGlvbiBJRCBpcyBub3QgdmFsaWRcbiAgICovXG4gIGdldFRyYW5zYWN0aW9uKHR4SWQ6IHN0cmluZyk6IFByb21pc2U8VHJhbnNhY3Rpb24+O1xuXG4gIC8qKlxuICAgKiBMaXN0IHRyYW5zYWN0aW9ucyBmb3IgYSB3YWxsZXQgd2l0aCBvcHRpb25hbCBmaWx0ZXJpbmdcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvblF1ZXJ5fSBwYXJhbXMgUXVlcnkgcGFyYW1ldGVycyBmb3IgZmlsdGVyaW5nIHRyYW5zYWN0aW9uc1xuICAgKiBAcGFyYW0ge2JpZ2ludH0gW3BhcmFtcy5saW1pdF0gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byByZXR1cm5cbiAgICogQHBhcmFtIHtEYXRlfSBbcGFyYW1zLnN0YXJ0RGF0ZV0gVGhlIHN0YXJ0IGRhdGUgZm9yIHRoZSBxdWVyeVxuICAgKiBAcGFyYW0ge0RhdGV9IFtwYXJhbXMuZW5kRGF0ZV0gVGhlIGVuZCBkYXRlIGZvciB0aGUgcXVlcnlcbiAgICogQHJldHVybnMge1Byb21pc2U8VHJhbnNhY3Rpb25bXT59IExpc3Qgb2YgdHJhbnNhY3Rpb25zXG4gICAqL1xuICBsaXN0VHJhbnNhY3Rpb25zKHBhcmFtczogVHJhbnNhY3Rpb25RdWVyeSk6IFByb21pc2U8VHJhbnNhY3Rpb25bXT47XG59XG5cbmV4cG9ydCBjbGFzcyBMaWdodG5pbmdXYWxsZXQgaW1wbGVtZW50cyBJTGlnaHRuaW5nV2FsbGV0IHtcbiAgcHVibGljIHdhbGxldDogc2RrY29yZS5JV2FsbGV0O1xuXG4gIGNvbnN0cnVjdG9yKHdhbGxldDogc2RrY29yZS5JV2FsbGV0KSB7XG4gICAgY29uc3QgY29pbiA9IHdhbGxldC5iYXNlQ29pbjtcbiAgICBpZiAoY29pbi5nZXRGYW1pbHkoKSAhPT0gJ2xuYnRjJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNvaW4gZm9yIGxpZ2h0bmluZyB3YWxsZXQ6ICR7Y29pbi5nZXRGYW1pbHkoKX1gKTtcbiAgICB9XG4gICAgdGhpcy53YWxsZXQgPSB3YWxsZXQ7XG4gIH1cblxuICBhc3luYyBjcmVhdGVJbnZvaWNlKHBhcmFtczogQ3JlYXRlSW52b2ljZUJvZHkpOiBQcm9taXNlPEludm9pY2U+IHtcbiAgICBjb25zdCBjcmVhdGVJbnZvaWNlUmVzcG9uc2UgPSBhd2FpdCB0aGlzLndhbGxldC5iaXRnb1xuICAgICAgLnBvc3QodGhpcy53YWxsZXQuYml0Z28udXJsKGAvd2FsbGV0LyR7dGhpcy53YWxsZXQuaWQoKX0vbGlnaHRuaW5nL2ludm9pY2VgLCAyKSlcbiAgICAgIC5zZW5kKHQuZXhhY3QoQ3JlYXRlSW52b2ljZUJvZHkpLmVuY29kZShwYXJhbXMpKVxuICAgICAgLnJlc3VsdCgpO1xuICAgIHJldHVybiBzZGtjb3JlLmRlY29kZU9yRWxzZShJbnZvaWNlLm5hbWUsIEludm9pY2UsIGNyZWF0ZUludm9pY2VSZXNwb25zZSwgKGVycm9yKSA9PiB7XG4gICAgICAvLyBET04nVCB0aHJvdyBlcnJvcnMgZnJvbSBkZWNvZGVPckVsc2UuIEl0IGNvdWxkIGxlYWsgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNyZWF0ZSBpbnZvaWNlIHJlc3BvbnNlICR7ZXJyb3J9YCk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBnZXRJbnZvaWNlKHBheW1lbnRIYXNoOiBzdHJpbmcpOiBQcm9taXNlPEludm9pY2VJbmZvPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLndhbGxldC5iaXRnb1xuICAgICAgLmdldCh0aGlzLndhbGxldC5iaXRnby51cmwoYC93YWxsZXQvJHt0aGlzLndhbGxldC5pZCgpfS9saWdodG5pbmcvaW52b2ljZS8ke3BheW1lbnRIYXNofWAsIDIpKVxuICAgICAgLnJlc3VsdCgpO1xuICAgIHJldHVybiBkZWNvZGVPckVsc2UoSW52b2ljZUluZm8ubmFtZSwgSW52b2ljZUluZm8sIHJlc3BvbnNlLCAoZXJyb3IpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBnZXQgaW52b2ljZSByZXNwb25zZSAke2Vycm9yfWApO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgbGlzdEludm9pY2VzKHBhcmFtczogSW52b2ljZVF1ZXJ5KTogUHJvbWlzZTxJbnZvaWNlSW5mb1tdPiB7XG4gICAgY29uc3QgcmV0dXJuQ29kZWMgPSB0LmFycmF5KEludm9pY2VJbmZvKTtcbiAgICBjb25zdCBjcmVhdGVJbnZvaWNlUmVzcG9uc2UgPSBhd2FpdCB0aGlzLndhbGxldC5iaXRnb1xuICAgICAgLmdldCh0aGlzLndhbGxldC5iaXRnby51cmwoYC93YWxsZXQvJHt0aGlzLndhbGxldC5pZCgpfS9saWdodG5pbmcvaW52b2ljZWAsIDIpKVxuICAgICAgLnF1ZXJ5KEludm9pY2VRdWVyeS5lbmNvZGUocGFyYW1zKSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgICByZXR1cm4gc2RrY29yZS5kZWNvZGVPckVsc2UocmV0dXJuQ29kZWMubmFtZSwgcmV0dXJuQ29kZWMsIGNyZWF0ZUludm9pY2VSZXNwb25zZSwgKGVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbGlzdCBpbnZvaWNlcyByZXNwb25zZSAke2Vycm9yfWApO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgcGF5SW52b2ljZShwYXJhbXM6IFN1Ym1pdFBheW1lbnRQYXJhbXMpOiBQcm9taXNlPFBheUludm9pY2VSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLndhbGxldC5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcblxuICAgIGNvbnN0IHsgdXNlckF1dGhLZXkgfSA9IGF3YWl0IGdldExpZ2h0bmluZ0F1dGhLZXljaGFpbnModGhpcy53YWxsZXQpO1xuICAgIGNvbnN0IHVzZXJBdXRoS2V5RW5jcnlwdGVkUHJ2ID0gdXNlckF1dGhLZXkuZW5jcnlwdGVkUHJ2O1xuICAgIGlmICghdXNlckF1dGhLZXlFbmNyeXB0ZWRQcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdXNlciBhdXRoIGtleSBpcyBtaXNzaW5nIGVuY3J5cHRlZCBwcml2YXRlIGtleWApO1xuICAgIH1cbiAgICBjb25zdCBzaWduYXR1cmUgPSBjcmVhdGVNZXNzYWdlU2lnbmF0dXJlKFxuICAgICAgdC5leGFjdChMaWdodG5pbmdQYXltZW50UmVxdWVzdCkuZW5jb2RlKHBhcmFtcyksXG4gICAgICB0aGlzLndhbGxldC5iaXRnby5kZWNyeXB0KHsgcGFzc3dvcmQ6IHBhcmFtcy5wYXNzcGhyYXNlLCBpbnB1dDogdXNlckF1dGhLZXlFbmNyeXB0ZWRQcnYgfSlcbiAgICApO1xuXG4gICAgY29uc3QgcGF5bWVudEludGVudDogeyBpbnRlbnQ6IExpZ2h0bmluZ1BheW1lbnRJbnRlbnQgfSA9IHtcbiAgICAgIGludGVudDoge1xuICAgICAgICBjb21tZW50OiBwYXJhbXMuY29tbWVudCxcbiAgICAgICAgc2VxdWVuY2VJZDogcGFyYW1zLnNlcXVlbmNlSWQsXG4gICAgICAgIGludGVudFR5cGU6ICdwYXltZW50JyxcbiAgICAgICAgc2lnbmVkUmVxdWVzdDoge1xuICAgICAgICAgIGludm9pY2U6IHBhcmFtcy5pbnZvaWNlLFxuICAgICAgICAgIGFtb3VudE1zYXQ6IHBhcmFtcy5hbW91bnRNc2F0LFxuICAgICAgICAgIGZlZUxpbWl0TXNhdDogcGFyYW1zLmZlZUxpbWl0TXNhdCxcbiAgICAgICAgICBmZWVMaW1pdFJhdGlvOiBwYXJhbXMuZmVlTGltaXRSYXRpbyxcbiAgICAgICAgfSxcbiAgICAgICAgc2lnbmF0dXJlLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25SZXF1ZXN0Q3JlYXRlID0gKGF3YWl0IHRoaXMud2FsbGV0LmJpdGdvXG4gICAgICAucG9zdCh0aGlzLndhbGxldC5iaXRnby51cmwoJy93YWxsZXQvJyArIHRoaXMud2FsbGV0LmlkKCkgKyAnL3R4cmVxdWVzdHMnLCAyKSlcbiAgICAgIC5zZW5kKHQudHlwZSh7IGludGVudDogTGlnaHRuaW5nUGF5bWVudEludGVudCB9KS5lbmNvZGUocGF5bWVudEludGVudCkpXG4gICAgICAucmVzdWx0KCkpIGFzIFR4UmVxdWVzdDtcblxuICAgIGlmICh0cmFuc2FjdGlvblJlcXVlc3RDcmVhdGUuc3RhdGUgPT09ICdwZW5kaW5nQXBwcm92YWwnKSB7XG4gICAgICBjb25zdCBwZW5kaW5nQXBwcm92YWxzID0gbmV3IFBlbmRpbmdBcHByb3ZhbHModGhpcy53YWxsZXQuYml0Z28sIHRoaXMud2FsbGV0LmJhc2VDb2luKTtcbiAgICAgIGNvbnN0IHBlbmRpbmdBcHByb3ZhbCA9IGF3YWl0IHBlbmRpbmdBcHByb3ZhbHMuZ2V0KHsgaWQ6IHRyYW5zYWN0aW9uUmVxdWVzdENyZWF0ZS5wZW5kaW5nQXBwcm92YWxJZCB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBlbmRpbmdBcHByb3ZhbDogcGVuZGluZ0FwcHJvdmFsLnRvSlNPTigpLFxuICAgICAgICB0eFJlcXVlc3RJZDogdHJhbnNhY3Rpb25SZXF1ZXN0Q3JlYXRlLnR4UmVxdWVzdElkLFxuICAgICAgICB0eFJlcXVlc3RTdGF0ZTogdHJhbnNhY3Rpb25SZXF1ZXN0Q3JlYXRlLnN0YXRlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvblJlcXVlc3RTZW5kID0gYXdhaXQgY29tbW9uVHNzTWV0aG9kcy5zZW5kVHhSZXF1ZXN0KFxuICAgICAgdGhpcy53YWxsZXQuYml0Z28sXG4gICAgICB0aGlzLndhbGxldC5pZCgpLFxuICAgICAgdHJhbnNhY3Rpb25SZXF1ZXN0Q3JlYXRlLnR4UmVxdWVzdElkLFxuICAgICAgUmVxdWVzdFR5cGUudHgsXG4gICAgICByZXFJZFxuICAgICk7XG5cbiAgICBjb25zdCBjb2luU3BlY2lmaWMgPSB0cmFuc2FjdGlvblJlcXVlc3RTZW5kLnRyYW5zYWN0aW9ucz8uWzBdPy51bnNpZ25lZFR4Py5jb2luU3BlY2lmaWM7XG4gICAgbGV0IHRyYW5zZmVyO1xuICAgIGlmIChjb2luU3BlY2lmaWMgJiYgY29pblNwZWNpZmljLnBheW1lbnRIYXNoICYmIHR5cGVvZiBjb2luU3BlY2lmaWMucGF5bWVudEhhc2ggPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cmFuc2ZlciA9IGF3YWl0IHRoaXMud2FsbGV0LmdldFRyYW5zZmVyKHsgaWQ6IGNvaW5TcGVjaWZpYy5wYXltZW50SGFzaCB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHR4UmVxdWVzdElkOiB0cmFuc2FjdGlvblJlcXVlc3RDcmVhdGUudHhSZXF1ZXN0SWQsXG4gICAgICB0eFJlcXVlc3RTdGF0ZTogdHJhbnNhY3Rpb25SZXF1ZXN0U2VuZC5zdGF0ZSxcbiAgICAgIHBheW1lbnRTdGF0dXM6IGNvaW5TcGVjaWZpY1xuICAgICAgICA/IHQuZXhhY3QoTG5kQ3JlYXRlUGF5bWVudFJlc3BvbnNlKS5lbmNvZGUoY29pblNwZWNpZmljIGFzIExuZENyZWF0ZVBheW1lbnRSZXNwb25zZSlcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICB0cmFuc2ZlcixcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgd2l0aGRyYXdPbmNoYWluKHBhcmFtczogTGlnaHRuaW5nT25jaGFpbldpdGhkcmF3UGFyYW1zKTogUHJvbWlzZTxMaWdodG5pbmdPbmNoYWluV2l0aGRyYXdSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLndhbGxldC5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcblxuICAgIGNvbnN0IHBheW1lbnRJbnRlbnQ6IHsgaW50ZW50OiBMaWdodG5pbmdQYXltZW50SW50ZW50IH0gPSB7XG4gICAgICBpbnRlbnQ6IHtcbiAgICAgICAgb25jaGFpblJlcXVlc3Q6IHtcbiAgICAgICAgICByZWNpcGllbnRzOiBwYXJhbXMucmVjaXBpZW50cyxcbiAgICAgICAgICBzYXRzUGVyVmJ5dGU6IHBhcmFtcy5zYXRzUGVyVmJ5dGUsXG4gICAgICAgIH0sXG4gICAgICAgIGludGVudFR5cGU6ICdwYXltZW50JyxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uUmVxdWVzdENyZWF0ZSA9IChhd2FpdCB0aGlzLndhbGxldC5iaXRnb1xuICAgICAgLnBvc3QodGhpcy53YWxsZXQuYml0Z28udXJsKCcvd2FsbGV0LycgKyB0aGlzLndhbGxldC5pZCgpICsgJy90eHJlcXVlc3RzJywgMikpXG4gICAgICAuc2VuZCh0LnR5cGUoeyBpbnRlbnQ6IExpZ2h0bmluZ1BheW1lbnRJbnRlbnQgfSkuZW5jb2RlKHBheW1lbnRJbnRlbnQpKVxuICAgICAgLnJlc3VsdCgpKSBhcyBUeFJlcXVlc3Q7XG5cbiAgICBpZiAodHJhbnNhY3Rpb25SZXF1ZXN0Q3JlYXRlLnN0YXRlID09PSAncGVuZGluZ0FwcHJvdmFsJykge1xuICAgICAgY29uc3QgcGVuZGluZ0FwcHJvdmFscyA9IG5ldyBQZW5kaW5nQXBwcm92YWxzKHRoaXMud2FsbGV0LmJpdGdvLCB0aGlzLndhbGxldC5iYXNlQ29pbik7XG4gICAgICBjb25zdCBwZW5kaW5nQXBwcm92YWwgPSBhd2FpdCBwZW5kaW5nQXBwcm92YWxzLmdldCh7IGlkOiB0cmFuc2FjdGlvblJlcXVlc3RDcmVhdGUucGVuZGluZ0FwcHJvdmFsSWQgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwZW5kaW5nQXBwcm92YWw6IHBlbmRpbmdBcHByb3ZhbC50b0pTT04oKSxcbiAgICAgICAgdHhSZXF1ZXN0SWQ6IHRyYW5zYWN0aW9uUmVxdWVzdENyZWF0ZS50eFJlcXVlc3RJZCxcbiAgICAgICAgdHhSZXF1ZXN0U3RhdGU6IHRyYW5zYWN0aW9uUmVxdWVzdENyZWF0ZS5zdGF0ZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25SZXF1ZXN0U2VuZCA9IGF3YWl0IGNvbW1vblRzc01ldGhvZHMuc2VuZFR4UmVxdWVzdChcbiAgICAgIHRoaXMud2FsbGV0LmJpdGdvLFxuICAgICAgdGhpcy53YWxsZXQuaWQoKSxcbiAgICAgIHRyYW5zYWN0aW9uUmVxdWVzdENyZWF0ZS50eFJlcXVlc3RJZCxcbiAgICAgIFJlcXVlc3RUeXBlLnR4LFxuICAgICAgcmVxSWRcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR4UmVxdWVzdElkOiB0cmFuc2FjdGlvblJlcXVlc3RDcmVhdGUudHhSZXF1ZXN0SWQsXG4gICAgICB0eFJlcXVlc3RTdGF0ZTogdHJhbnNhY3Rpb25SZXF1ZXN0U2VuZC5zdGF0ZSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZ2V0UGF5bWVudChwYXltZW50SGFzaDogc3RyaW5nKTogUHJvbWlzZTxQYXltZW50SW5mbz4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy53YWxsZXQuYml0Z29cbiAgICAgIC5nZXQodGhpcy53YWxsZXQuYml0Z28udXJsKGAvd2FsbGV0LyR7dGhpcy53YWxsZXQuaWQoKX0vbGlnaHRuaW5nL3BheW1lbnQvJHtwYXltZW50SGFzaH1gLCAyKSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgICByZXR1cm4gZGVjb2RlT3JFbHNlKFBheW1lbnRJbmZvLm5hbWUsIFBheW1lbnRJbmZvLCByZXNwb25zZSwgKGVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGF5bWVudCByZXNwb25zZTogJHtlcnJvcn1gKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RQYXltZW50cyhwYXJhbXM6IFBheW1lbnRRdWVyeSk6IFByb21pc2U8UGF5bWVudEluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy53YWxsZXQuYml0Z29cbiAgICAgIC5nZXQodGhpcy53YWxsZXQuYml0Z28udXJsKGAvd2FsbGV0LyR7dGhpcy53YWxsZXQuaWQoKX0vbGlnaHRuaW5nL3BheW1lbnRgLCAyKSlcbiAgICAgIC5xdWVyeShQYXltZW50UXVlcnkuZW5jb2RlKHBhcmFtcykpXG4gICAgICAucmVzdWx0KCk7XG4gICAgcmV0dXJuIGRlY29kZU9yRWxzZSh0LmFycmF5KFBheW1lbnRJbmZvKS5uYW1lLCB0LmFycmF5KFBheW1lbnRJbmZvKSwgcmVzcG9uc2UsIChlcnJvcikgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBheW1lbnQgbGlzdCByZXNwb25zZTogJHtlcnJvcn1gKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGdldFRyYW5zYWN0aW9uKHR4SWQ6IHN0cmluZyk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMud2FsbGV0LmJpdGdvXG4gICAgICAuZ2V0KHRoaXMud2FsbGV0LmJpdGdvLnVybChgL3dhbGxldC8ke3RoaXMud2FsbGV0LmlkKCl9L2xpZ2h0bmluZy90cmFuc2FjdGlvbi8ke3R4SWR9YCwgMikpXG4gICAgICAucmVzdWx0KCk7XG4gICAgcmV0dXJuIGRlY29kZU9yRWxzZShUcmFuc2FjdGlvbi5uYW1lLCBUcmFuc2FjdGlvbiwgcmVzcG9uc2UsIChlcnJvcikgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRyYW5zYWN0aW9uIHJlc3BvbnNlOiAke2Vycm9yfWApO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgbGlzdFRyYW5zYWN0aW9ucyhwYXJhbXM6IFRyYW5zYWN0aW9uUXVlcnkpOiBQcm9taXNlPFRyYW5zYWN0aW9uW10+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMud2FsbGV0LmJpdGdvXG4gICAgICAuZ2V0KHRoaXMud2FsbGV0LmJpdGdvLnVybChgL3dhbGxldC8ke3RoaXMud2FsbGV0LmlkKCl9L2xpZ2h0bmluZy90cmFuc2FjdGlvbmAsIDIpKVxuICAgICAgLnF1ZXJ5KFRyYW5zYWN0aW9uUXVlcnkuZW5jb2RlKHBhcmFtcykpXG4gICAgICAucmVzdWx0KCk7XG4gICAgcmV0dXJuIGRlY29kZU9yRWxzZSh0LmFycmF5KFRyYW5zYWN0aW9uKS5uYW1lLCB0LmFycmF5KFRyYW5zYWN0aW9uKSwgcmVzcG9uc2UsIChlcnJvcikgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRyYW5zYWN0aW9uIGxpc3QgcmVzcG9uc2U6ICR7ZXJyb3J9YCk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==

Выполнить команду


Для локальной разработки. Не используйте в интернете!