UNPKG

@neo-one/node-blockchain-esnext-cjs

Version:

NEO•ONE NEO blockchain implementation.

138 lines (136 loc) 22 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const fromPairs_1 = tslib_1.__importDefault(require("lodash/fromPairs")); const client_core_1 = require("@neo-one/client-core-esnext-cjs"); const node_core_1 = require("@neo-one/node-core-esnext-cjs"); const toArray_1 = require("rxjs/internal/operators/toArray"); class ValidatorCache { constructor(blockchain) { this.blockchain = blockchain; this.mutableAccounts = {}; this.mutableValidators = {}; } async getAccount(hash) { let account = this.mutableAccounts[client_core_1.common.uInt160ToHex(hash)]; if (account === undefined) { account = await this.blockchain.account.tryGet({ hash }); } if (account === undefined) { account = new client_core_1.Account({ hash }); } this.mutableAccounts[client_core_1.common.uInt160ToHex(hash)] = account; return account; } async updateAccountBalance(hash, asset, value) { const assetHex = client_core_1.common.uInt256ToHex(asset); await this.getAccount(hash); const hashHex = client_core_1.common.uInt160ToHex(hash); const account = this.mutableAccounts[hashHex]; const balance = account.balances[assetHex]; this.mutableAccounts[hashHex] = account.update({ balances: { ...account.balances, [assetHex]: value.add(balance === undefined ? client_core_1.utils.ZERO : balance) } }); } async getValidator(publicKey) { const publicKeyHex = client_core_1.common.ecPointToHex(publicKey); let validator = this.mutableValidators[publicKeyHex]; if (validator === undefined) { validator = await this.blockchain.validator.tryGet({ publicKey }); } if (validator === undefined) { validator = new client_core_1.Validator({ publicKey }); } this.mutableValidators[publicKeyHex] = validator; return validator; } async addValidator(validator) { this.mutableValidators[client_core_1.common.ecPointToHex(validator.publicKey)] = validator; } async deleteValidator(publicKey) { this.mutableValidators[client_core_1.common.ecPointToHex(publicKey)] = undefined; } async updateValidatorVotes(publicKey, value) { await this.getValidator(publicKey); const publicKeyHex = client_core_1.common.ecPointToHex(publicKey); const validator = this.mutableValidators[publicKeyHex]; if (validator === undefined) { throw new Error('For Flow'); } this.mutableValidators[publicKeyHex] = validator.update({ votes: validator.votes.add(value) }); } async updateValidator(publicKey, update) { await this.getValidator(publicKey); const publicKeyHex = client_core_1.common.ecPointToHex(publicKey); const validator = this.mutableValidators[publicKeyHex]; if (validator === undefined) { throw new Error('For Flow'); } const newValidator = validator.update(update); this.mutableValidators[publicKeyHex] = newValidator; return newValidator; } async getAllValidators() { const validators = await this.blockchain.validator.all$.pipe(toArray_1.toArray()).toPromise(); const mutablePublicKeyToValidator = fromPairs_1.default(validators.map(validator => [client_core_1.common.ecPointToHex(validator.publicKey), validator])); Object.entries(this.mutableValidators).forEach(([publicKey, validator]) => { const publicKeyHex = client_core_1.common.ecPointToHex(publicKey); if (validator === undefined) { // tslint:disable-next-line no-dynamic-delete delete mutablePublicKeyToValidator[publicKeyHex]; } else { mutablePublicKeyToValidator[publicKeyHex] = validator; } }); return Object.values(mutablePublicKeyToValidator); } async getValidatorsCount() { let validatorsCount = this.mutableValidatorsCount; if (validatorsCount === undefined) { validatorsCount = await this.blockchain.validatorsCount.tryGet(); } if (validatorsCount === undefined) { validatorsCount = new node_core_1.ValidatorsCount(); } this.mutableValidatorsCount = validatorsCount; return validatorsCount; } async updateValidatorsCountVotes(index, value) { await this.getValidatorsCount(); const validatorsCount = this.mutableValidatorsCount; if (validatorsCount === undefined) { throw new Error('For Flow'); } const votes = validatorsCount.votes[index]; this.mutableValidatorsCount = validatorsCount.update({ votes: validatorsCount.votes.slice(0, index).concat((votes === undefined ? client_core_1.utils.ZERO : votes).add(value)).concat(validatorsCount.votes.slice(index + 1)) }); } async addValidatorsCount(validatorsCount) { this.mutableValidatorsCount = validatorsCount; } async updateValidatorsCount(update) { await this.getValidatorsCount(); const validatorsCount = this.mutableValidatorsCount; if (validatorsCount === undefined) { throw new Error('For Flow'); } this.mutableValidatorsCount = validatorsCount.update(update); return this.mutableValidatorsCount; } } exports.ValidatorCache = ValidatorCache; //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlZhbGlkYXRvckNhY2hlLnRzIl0sIm5hbWVzIjpbIlZhbGlkYXRvckNhY2hlIiwiYmxvY2tjaGFpbiIsIm11dGFibGVBY2NvdW50cyIsIm11dGFibGVWYWxpZGF0b3JzIiwiZ2V0QWNjb3VudCIsImhhc2giLCJhY2NvdW50IiwiY29tbW9uIiwidUludDE2MFRvSGV4IiwidW5kZWZpbmVkIiwidHJ5R2V0IiwiQWNjb3VudCIsInVwZGF0ZUFjY291bnRCYWxhbmNlIiwiYXNzZXQiLCJ2YWx1ZSIsImFzc2V0SGV4IiwidUludDI1NlRvSGV4IiwiaGFzaEhleCIsImJhbGFuY2UiLCJiYWxhbmNlcyIsInVwZGF0ZSIsImFkZCIsInV0aWxzIiwiWkVSTyIsImdldFZhbGlkYXRvciIsInB1YmxpY0tleSIsInB1YmxpY0tleUhleCIsImVjUG9pbnRUb0hleCIsInZhbGlkYXRvciIsIlZhbGlkYXRvciIsImFkZFZhbGlkYXRvciIsImRlbGV0ZVZhbGlkYXRvciIsInVwZGF0ZVZhbGlkYXRvclZvdGVzIiwiRXJyb3IiLCJ2b3RlcyIsInVwZGF0ZVZhbGlkYXRvciIsIm5ld1ZhbGlkYXRvciIsImdldEFsbFZhbGlkYXRvcnMiLCJ2YWxpZGF0b3JzIiwiYWxsJCIsInBpcGUiLCJ0b0FycmF5IiwidG9Qcm9taXNlIiwibXV0YWJsZVB1YmxpY0tleVRvVmFsaWRhdG9yIiwibWFwIiwiT2JqZWN0IiwiZW50cmllcyIsImZvckVhY2giLCJ2YWx1ZXMiLCJnZXRWYWxpZGF0b3JzQ291bnQiLCJ2YWxpZGF0b3JzQ291bnQiLCJtdXRhYmxlVmFsaWRhdG9yc0NvdW50IiwiVmFsaWRhdG9yc0NvdW50IiwidXBkYXRlVmFsaWRhdG9yc0NvdW50Vm90ZXMiLCJpbmRleCIsInNsaWNlIiwiY29uY2F0IiwiYWRkVmFsaWRhdG9yc0NvdW50IiwidXBkYXRlVmFsaWRhdG9yc0NvdW50Il0sIm1hcHBpbmdzIjoiOzs7QUFBQSx5RUFBMEM7QUFBMUMsc0RBQUE7QUFDQSxrREFBQTtBQUdBLDZE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Z0IsZUFBQUEsQ0FBZ0JoQixLQUFoQixDQUNKcUIsS0FESSxDQUNFLENBREYsRUFDS0QsS0FETCxDQUFBLENBRUpFLE1BRkksQ0FFRyxDQUFDdEIsS0FBQUEsS0FBVXpCLFNBQVYsQ0FBQSxDQUFBLENBQXNCYSxtQkFBQUEsQ0FBTUMsSUFBNUIsQ0FBQSxDQUFBLENBQW1DVyxLQUFwQyxDQUFBLENBQTJDYixHQUEzQyxDQUErQ1AsS0FBL0MsQ0FGSCxDQUFBLENBR0owQyxNQUhJLENBR0dOLGVBQUFBLENBQWdCaEIsS0FBaEIsQ0FBc0JxQixLQUF0QixDQUE0QkQsS0FBQUEsR0FBUSxDQUFwQyxDQUhILENBQUE7U0FEcUIsQ0FBOUIsQ0FBQTtJQU1ELENBQUE7SUFFRCxLQUFBLENBQWFHLGtCQUFiLENBQWdDUCxlQUFoQztRQUNFLElBQUEsQ0FBS0Msc0JBQUwsR0FBOEJELGVBQTlCLENBQUE7SUFDRCxDQUFBO0lBRUQsS0FBQSxDQUFhUSxxQkFBYixDQUFtQ3RDLE1BQW5DO1FBQ0UsTUFBTSxJQUFBLENBQUs2QixrQkFBTCxFQUFOLENBQUE7UUFDQSxNQUFNQyxlQUFBQSxHQUFrQixJQUFBLENBQUtDLHNCQUE3QixDQUFBO1FBQ0EsSUFBSUQsZUFBQUEsS0FBb0J6QyxTQUF4QixFQUFtQztZQUNqQyxNQUFNLElBQUl3QixLQUFKLENBQVUsVUFBVixDQUFOLENBQUE7U0FDRDtRQUVELElBQUEsQ0FBS2tCLHNCQUFMLEdBQThCRCxlQUFBQSxDQUFnQjlCLE1BQWhCLENBQXVCQSxNQUF2QixDQUE5QixDQUFBO1FBRUEsT0FBTyxJQUFBLENBQUsrQixzQkFBWixDQUFBO0lBQ0QsQ0FBQTtDQWhLeUI7QUFBNUIsd0NBQTRCIiwiZmlsZSI6Im5lby1vbmUtbm9kZS1ibG9ja2NoYWluL3NyYy9WYWxpZGF0b3JDYWNoZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFjY291bnQsIGNvbW1vbiwgRUNQb2ludCwgVUludDE2MCwgVUludDI1NiwgdXRpbHMsIFZhbGlkYXRvciwgVmFsaWRhdG9yVXBkYXRlIH0gZnJvbSAnQG5lby1vbmUvY2xpZW50LWNvcmUnO1xuaW1wb3J0IHsgVmFsaWRhdG9yc0NvdW50LCBWYWxpZGF0b3JzQ291bnRVcGRhdGUgfSBmcm9tICdAbmVvLW9uZS9ub2RlLWNvcmUnO1xuaW1wb3J0IHsgQk4gfSBmcm9tICdibi5qcyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgdG9BcnJheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEJsb2NrY2hhaW4gfSBmcm9tICcuL0Jsb2NrY2hhaW4nO1xuXG5leHBvcnQgY2xhc3MgVmFsaWRhdG9yQ2FjaGUge1xuICBwcml2YXRlIHJlYWRvbmx5IGJsb2NrY2hhaW46IEJsb2NrY2hhaW47XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSByZWFkb25seS1rZXl3b3JkXG4gIHByaXZhdGUgcmVhZG9ubHkgbXV0YWJsZUFjY291bnRzOiB7IFtrZXk6IHN0cmluZ106IEFjY291bnQgfTtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIHJlYWRvbmx5LWtleXdvcmRcbiAgcHJpdmF0ZSByZWFkb25seSBtdXRhYmxlVmFsaWRhdG9yczogeyBba2V5OiBzdHJpbmddOiBWYWxpZGF0b3IgfCB1bmRlZmluZWQgfTtcbiAgcHJpdmF0ZSBtdXRhYmxlVmFsaWRhdG9yc0NvdW50OiBWYWxpZGF0b3JzQ291bnQgfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGJsb2NrY2hhaW46IEJsb2NrY2hhaW4pIHtcbiAgICB0aGlzLmJsb2NrY2hhaW4gPSBibG9ja2NoYWluO1xuICAgIHRoaXMubXV0YWJsZUFjY291bnRzID0ge307XG4gICAgdGhpcy5tdXRhYmxlVmFsaWRhdG9ycyA9IHt9O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEFjY291bnQoaGFzaDogVUludDE2MCk6IFByb21pc2U8QWNjb3VudD4ge1xuICAgIGxldCBhY2NvdW50ID0gdGhpcy5tdXRhYmxlQWNjb3VudHNbY29tbW9uLnVJbnQxNjBUb0hleChoYXNoKV0gYXMgQWNjb3VudCB8IHVuZGVmaW5lZDtcbiAgICBpZiAoYWNjb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhY2NvdW50ID0gYXdhaXQgdGhpcy5ibG9ja2NoYWluLmFjY291bnQudHJ5R2V0KHsgaGFzaCB9KTtcbiAgICB9XG5cbiAgICBpZiAoYWNjb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhY2NvdW50ID0gbmV3IEFjY291bnQoeyBoYXNoIH0pO1xuICAgIH1cblxuICAgIHRoaXMubXV0YWJsZUFjY291bnRzW2NvbW1vbi51SW50MTYwVG9IZXgoaGFzaCldID0gYWNjb3VudDtcblxuICAgIHJldHVybiBhY2NvdW50O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHVwZGF0ZUFjY291bnRCYWxhbmNlKGhhc2g6IFVJbnQxNjAsIGFzc2V0OiBVSW50MjU2LCB2YWx1ZTogQk4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhc3NldEhleCA9IGNvbW1vbi51SW50MjU2VG9IZXgoYXNzZXQpO1xuICAgIGF3YWl0IHRoaXMuZ2V0QWNjb3VudChoYXNoKTtcbiAgICBjb25zdCBoYXNoSGV4ID0gY29tbW9uLnVJbnQxNjBUb0hleChoYXNoKTtcbiAgICBjb25zdCBhY2NvdW50ID0gdGhpcy5tdXRhYmxlQWNjb3VudHNbaGFzaEhleF07XG4gICAgY29uc3QgYmFsYW5jZSA9IGFjY291bnQuYmFsYW5jZXNbYXNzZXRIZXhdO1xuICAgIHRoaXMubXV0YWJsZUFjY291bnRzW2hhc2hIZXhdID0gYWNjb3VudC51cGRhdGUoe1xuICAgICAgYmFsYW5jZXM6IHtcbiAgICAgICAgLi4uYWNjb3VudC5iYWxhbmNlcyxcbiAgICAgICAgW2Fzc2V0SGV4XTogdmFsdWUuYWRkKGJhbGFuY2UgPT09IHVuZGVmaW5lZCA/IHV0aWxzLlpFUk8gOiBiYWxhbmNlKSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0VmFsaWRhdG9yKHB1YmxpY0tleTogRUNQb2ludCk6IFByb21pc2U8VmFsaWRhdG9yPiB7XG4gICAgY29uc3QgcHVibGljS2V5SGV4ID0gY29tbW9uLmVjUG9pbnRUb0hleChwdWJsaWNLZXkpO1xuXG4gICAgbGV0IHZhbGlkYXRvciA9IHRoaXMubXV0YWJsZVZhbGlkYXRvcnNbcHVibGljS2V5SGV4XTtcbiAgICBpZiAodmFsaWRhdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhbGlkYXRvciA9IGF3YWl0IHRoaXMuYmxvY2tjaGFpbi52YWxpZGF0b3IudHJ5R2V0KHsgcHVibGljS2V5IH0pO1xuICAgIH1cblxuICAgIGlmICh2YWxpZGF0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsaWRhdG9yID0gbmV3IFZhbGlkYXRvcih7IHB1YmxpY0tleSB9KTtcbiAgICB9XG5cbiAgICB0aGlzLm11dGFibGVWYWxpZGF0b3JzW3B1YmxpY0tleUhleF0gPSB2YWxpZGF0b3I7XG5cbiAgICByZXR1cm4gdmFsaWRhdG9yO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFkZFZhbGlkYXRvcih2YWxpZGF0b3I6IFZhbGlkYXRvcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubXV0YWJsZVZhbGlkYXRvcnNbY29tbW9uLmVjUG9pbnRUb0hleCh2YWxpZGF0b3IucHVibGljS2V5KV0gPSB2YWxpZGF0b3I7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVsZXRlVmFsaWRhdG9yKHB1YmxpY0tleTogRUNQb2ludCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubXV0YWJsZVZhbGlkYXRvcnNbY29tbW9uLmVjUG9pbnRUb0hleChwdWJsaWNLZXkpXSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVWYWxpZGF0b3JWb3RlcyhwdWJsaWNLZXk6IEVDUG9pbnQsIHZhbHVlOiBCTik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZ2V0VmFsaWRhdG9yKHB1YmxpY0tleSk7XG4gICAgY29uc3QgcHVibGljS2V5SGV4ID0gY29tbW9uLmVjUG9pbnRUb0hleChwdWJsaWNLZXkpO1xuICAgIGNvbnN0IHZhbGlkYXRvciA9IHRoaXMubXV0YWJsZVZhbGlkYXRvcnNbcHVibGljS2V5SGV4XTtcbiAgICBpZiAodmFsaWRhdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRm9yIEZsb3cnKTtcbiAgICB9XG5cbiAgICB0aGlzLm11dGFibGVWYWxpZGF0b3JzW3B1YmxpY0tleUhleF0gPSB2YWxpZGF0b3IudXBkYXRlKHtcbiAgICAgIHZvdGVzOiB2YWxpZGF0b3Iudm90ZXMuYWRkKHZhbHVlKSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVWYWxpZGF0b3IocHVibGljS2V5OiBFQ1BvaW50LCB1cGRhdGU6IFZhbGlkYXRvclVwZGF0ZSk6IFByb21pc2U8VmFsaWRhdG9yPiB7XG4gICAgYXdhaXQgdGhpcy5nZXRWYWxpZGF0b3IocHVibGljS2V5KTtcbiAgICBjb25zdCBwdWJsaWNLZXlIZXggPSBjb21tb24uZWNQb2ludFRvSGV4KHB1YmxpY0tleSk7XG4gICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy5tdXRhYmxlVmFsaWRhdG9yc1twdWJsaWNLZXlIZXhdO1xuICAgIGlmICh2YWxpZGF0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3IgRmxvdycpO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1ZhbGlkYXRvciA9IHZhbGlkYXRvci51cGRhdGUodXBkYXRlKTtcbiAgICB0aGlzLm11dGFibGVWYWxpZGF0b3JzW3B1YmxpY0tleUhleF0gPSBuZXdWYWxpZGF0b3I7XG5cbiAgICByZXR1cm4gbmV3VmFsaWRhdG9yO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEFsbFZhbGlkYXRvcnMoKTogUHJvbWlzZTxSZWFkb25seUFycmF5PFZhbGlkYXRvcj4+IHtcbiAgICBjb25zdCB2YWxpZGF0b3JzID0gYXdhaXQgdGhpcy5ibG9ja2NoYWluLnZhbGlkYXRvci5hbGwkLnBpcGUodG9BcnJheSgpKS50b1Byb21pc2UoKTtcbiAgICBjb25zdCBtdXRhYmxlUHVibGljS2V5VG9WYWxpZGF0b3IgPSBfLmZyb21QYWlycyhcbiAgICAgIHZhbGlkYXRvcnMubWFwKCh2YWxpZGF0b3IpID0+IFtjb21tb24uZWNQb2ludFRvSGV4KHZhbGlkYXRvci5wdWJsaWNLZXkpLCB2YWxpZGF0b3JdKSxcbiAgICApO1xuXG4gICAgT2JqZWN0LmVudHJpZXModGhpcy5tdXRhYmxlVmFsaWRhdG9ycykuZm9yRWFjaCgoW3B1YmxpY0tleSwgdmFsaWRhdG9yXSkgPT4ge1xuICAgICAgY29uc3QgcHVibGljS2V5SGV4ID0gY29tbW9uLmVjUG9pbnRUb0hleChwdWJsaWNLZXkpO1xuICAgICAgaWYgKHZhbGlkYXRvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1keW5hbWljLWRlbGV0ZVxuICAgICAgICBkZWxldGUgbXV0YWJsZVB1YmxpY0tleVRvVmFsaWRhdG9yW3B1YmxpY0tleUhleF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtdXRhYmxlUHVibGljS2V5VG9WYWxpZGF0b3JbcHVibGljS2V5SGV4XSA9IHZhbGlkYXRvcjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBPYmplY3QudmFsdWVzKG11dGFibGVQdWJsaWNLZXlUb1ZhbGlkYXRvcik7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0VmFsaWRhdG9yc0NvdW50KCk6IFByb21pc2U8VmFsaWRhdG9yc0NvdW50PiB7XG4gICAgbGV0IHZhbGlkYXRvcnNDb3VudCA9IHRoaXMubXV0YWJsZVZhbGlkYXRvcnNDb3VudDtcbiAgICBpZiAodmFsaWRhdG9yc0NvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhbGlkYXRvcnNDb3VudCA9IGF3YWl0IHRoaXMuYmxvY2tjaGFpbi52YWxpZGF0b3JzQ291bnQudHJ5R2V0KCk7XG4gICAgfVxuXG4gICAgaWYgKHZhbGlkYXRvcnNDb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YWxpZGF0b3JzQ291bnQgPSBuZXcgVmFsaWRhdG9yc0NvdW50KCk7XG4gICAgfVxuXG4gICAgdGhpcy5tdXRhYmxlVmFsaWRhdG9yc0NvdW50ID0gdmFsaWRhdG9yc0NvdW50O1xuXG4gICAgcmV0dXJuIHZhbGlkYXRvcnNDb3VudDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVWYWxpZGF0b3JzQ291bnRWb3RlcyhpbmRleDogbnVtYmVyLCB2YWx1ZTogQk4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmdldFZhbGlkYXRvcnNDb3VudCgpO1xuICAgIGNvbnN0IHZhbGlkYXRvcnNDb3VudCA9IHRoaXMubXV0YWJsZVZhbGlkYXRvcnNDb3VudDtcbiAgICBpZiAodmFsaWRhdG9yc0NvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRm9yIEZsb3cnKTtcbiAgICB9XG5cbiAgICBjb25zdCB2b3RlcyA9IHZhbGlkYXRvcnNDb3VudC52b3Rlc1tpbmRleF07XG5cbiAgICB0aGlzLm11dGFibGVWYWxpZGF0b3JzQ291bnQgPSB2YWxpZGF0b3JzQ291bnQudXBkYXRlKHtcbiAgICAgIHZvdGVzOiB2YWxpZGF0b3JzQ291bnQudm90ZXNcbiAgICAgICAgLnNsaWNlKDAsIGluZGV4KVxuICAgICAgICAuY29uY2F0KCh2b3RlcyA9PT0gdW5kZWZpbmVkID8gdXRpbHMuWkVSTyA6IHZvdGVzKS5hZGQodmFsdWUpKVxuICAgICAgICAuY29uY2F0KHZhbGlkYXRvcnNDb3VudC52b3Rlcy5zbGljZShpbmRleCArIDEpKSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhZGRWYWxpZGF0b3JzQ291bnQodmFsaWRhdG9yc0NvdW50OiBWYWxpZGF0b3JzQ291bnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLm11dGFibGVWYWxpZGF0b3JzQ291bnQgPSB2YWxpZGF0b3JzQ291bnQ7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdXBkYXRlVmFsaWRhdG9yc0NvdW50KHVwZGF0ZTogVmFsaWRhdG9yc0NvdW50VXBkYXRlKTogUHJvbWlzZTxWYWxpZGF0b3JzQ291bnQ+IHtcbiAgICBhd2FpdCB0aGlzLmdldFZhbGlkYXRvcnNDb3VudCgpO1xuICAgIGNvbnN0IHZhbGlkYXRvcnNDb3VudCA9IHRoaXMubXV0YWJsZVZhbGlkYXRvcnNDb3VudDtcbiAgICBpZiAodmFsaWRhdG9yc0NvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRm9yIEZsb3cnKTtcbiAgICB9XG5cbiAgICB0aGlzLm11dGFibGVWYWxpZGF0b3JzQ291bnQgPSB2YWxpZGF0b3JzQ291bnQudXBkYXRlKHVwZGF0ZSk7XG5cbiAgICByZXR1cm4gdGhpcy5tdXRhYmxlVmFsaWRhdG9yc0NvdW50O1xuICB9XG59XG4iXX0=