"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Quarantine = exports.getQuarantineOptions = exports.validateQuarantineOptions = void 0; const base_1 = __importDefault(require("./base")); const quarantine_option_names_1 = __importDefault(require("../../configuration/quarantine-option-names")); const types_1 = require("../../errors/types"); const runtime_1 = require("../../errors/runtime"); const DEFAULT_ATTEMPT_LIMIT = 5; const DEFAULT_THRESHOLD = 3; const MIN_ATTEMPT_LIMIT = 2; const MIN_SUCCESS_THRESHOLD = 1; function _isQuarantineOption(option) { return Object.values(quarantine_option_names_1.default).includes(option); } function validateQuarantineOptions(options) { for (const key in options) { if (!_isQuarantineOption(key)) throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.invalidQuarantineOption, key); } const attemptLimit = typeof options.attemptLimit === 'number' ? options.attemptLimit : DEFAULT_ATTEMPT_LIMIT; const successThreshold = typeof options.successThreshold === 'number' ? options.successThreshold : DEFAULT_THRESHOLD; if (attemptLimit < MIN_ATTEMPT_LIMIT) throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.invalidAttemptLimitValue, quarantine_option_names_1.default.attemptLimit, MIN_ATTEMPT_LIMIT); if (successThreshold < MIN_SUCCESS_THRESHOLD) throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.invalidSuccessThresholdValue, quarantine_option_names_1.default.successThreshold, MIN_SUCCESS_THRESHOLD); if (successThreshold >= attemptLimit) throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.invalidQuarantineParametersRatio, attemptLimit, successThreshold); } exports.validateQuarantineOptions = validateQuarantineOptions; async function getQuarantineOptions(optionName, options) { if (typeof options === 'boolean') return true; const parsedOptions = await (0, base_1.default)(options, { skipOptionValueTypeConversion: true, async onOptionParsed(key, value) { if (!key || !value) throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.optionValueIsNotValidKeyValue, optionName); return Number(value); }, }); validateQuarantineOptions(parsedOptions); return parsedOptions; } exports.getQuarantineOptions = getQuarantineOptions; class Quarantine { constructor() { this.attempts = []; this.attemptLimit = DEFAULT_ATTEMPT_LIMIT; this.successThreshold = DEFAULT_THRESHOLD; this.failureThreshold = DEFAULT_THRESHOLD; } getFailedAttempts() { return this.attempts.filter(({ errors }) => !!errors.length); } getPassedAttempts() { return this.attempts.filter(({ errors }) => errors.length === 0); } setCustomParameters(attemptLimit, successThreshold) { const needToUpdateTestRunThreshold = typeof attemptLimit === 'number'; const needToUpdatePassedQuarantineThreshold = typeof successThreshold === 'number'; const needToRecalculateFailedThreshold = needToUpdateTestRunThreshold || needToUpdatePassedQuarantineThreshold; if (needToUpdateTestRunThreshold) this.attemptLimit = attemptLimit; if (needToUpdatePassedQuarantineThreshold) this.successThreshold = successThreshold; if (needToRecalculateFailedThreshold) this._setFailedThreshold(); } getNextAttemptNumber() { return this.attempts.length + 1; } isThresholdReached(extraErrors) { const { passedTimes, failedTimes } = this._getAttemptsResult(extraErrors); const successThresholdReached = passedTimes >= this.successThreshold; const failureThresholdReached = failedTimes >= this.failureThreshold; return successThresholdReached || failureThresholdReached; } isFirstAttemptSuccessful(extraErrors) { const { failedTimes, passedTimes } = this._getAttemptsResult(extraErrors); return failedTimes === 0 && passedTimes > 0; } _getAttemptsResult(extraErrors) { let failedTimes = this.getFailedAttempts().length; let passedTimes = this.getPassedAttempts().length; if (extraErrors) { if (extraErrors.length) failedTimes += extraErrors.length; else passedTimes += 1; } return { failedTimes, passedTimes }; } _setFailedThreshold() { this.failureThreshold = this.attemptLimit - this.successThreshold + 1; } } exports.Quarantine = Quarantine; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVhcmFudGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9nZXQtb3B0aW9ucy9xdWFyYW50aW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGtEQUFvQztBQUNwQywwR0FBa0Y7QUFDbEYsOENBQW9EO0FBQ3BELGtEQUFvRDtBQUlwRCxNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQztBQUNoQyxNQUFNLGlCQUFpQixHQUFPLENBQUMsQ0FBQztBQUNoQyxNQUFNLGlCQUFpQixHQUFPLENBQUMsQ0FBQztBQUNoQyxNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQztBQUVoQyxTQUFTLG1CQUFtQixDQUFFLE1BQWM7SUFDeEMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLGlDQUF1QixDQUFDLENBQUMsUUFBUSxDQUFDLE1BQWlDLENBQUMsQ0FBQztBQUM5RixDQUFDO0FBRUQsU0FBZ0IseUJBQXlCLENBQUUsT0FBb0M7SUFDM0UsS0FBSyxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUU7UUFDdkIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQztZQUN6QixNQUFNLElBQUksc0JBQVksQ0FBQyxzQkFBYyxDQUFDLHVCQUF1QixFQUFFLEdBQUcsQ0FBQyxDQUFDO0tBQzNFO0lBRUQsTUFBTSxZQUFZLEdBQU8sT0FBTyxPQUFPLENBQUMsWUFBWSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUM7SUFDakgsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLE9BQU8sQ0FBQyxnQkFBZ0IsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUM7SUFFckgsSUFBSSxZQUFZLEdBQUcsaUJBQWlCO1FBQ2hDLE1BQU0sSUFBSSxzQkFBWSxDQUFDLHNCQUFjLENBQUMsd0JB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QixHQUFHLFdBQVcsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFFckUsT0FBTyx1QkFBdUIsSUFBSSx1QkFBdUIsQ0FBQztJQUM5RCxDQUFDO0lBRU0sd0JBQXdCLENBQUUsV0FBNkM7UUFDMUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFMUUsT0FBTyxXQUFXLEtBQUssQ0FBQyxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVPLGtCQUFrQixDQUFFLFdBQThDO1FBQ3RFLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNsRCxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFFbEQsSUFBSSxXQUFXLEVBQUU7WUFDYixJQUFJLFdBQVcsQ0FBQyxNQUFNO2dCQUNsQixXQUFXLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQzs7Z0JBRWxDLFdBQVcsSUFBSSxDQUFDLENBQUM7U0FDeEI7UUFFRCxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFTyxtQkFBbUI7UUFDdkIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztJQUMxRSxDQUFDO0NBQ0o7QUFuRUQsZ0NBbUVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGJhc2VHZXRPcHRpb25zIGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgUVVBUkFOVElORV9PUFRJT05fTkFNRVMgZnJvbSAnLi4vLi4vY29uZmlndXJhdGlvbi9xdWFyYW50aW5lLW9wdGlvbi1uYW1lcyc7XG5pbXBvcnQgeyBSVU5USU1FX0VSUk9SUyB9IGZyb20gJy4uLy4uL2Vycm9ycy90eXBlcyc7XG5pbXBvcnQgeyBHZW5lcmFsRXJyb3IgfSBmcm9tICcuLi8uLi9lcnJvcnMvcnVudGltZSc7XG5pbXBvcnQgeyBEaWN0aW9uYXJ5IH0gZnJvbSAnLi4vLi4vY29uZmlndXJhdGlvbi9pbnRlcmZhY2VzJztcbmltcG9ydCBUZXN0UnVuRXJyb3JGb3JtYXR0YWJsZUFkYXB0ZXIgZnJvbSAnLi4vLi4vZXJyb3JzL3Rlc3QtcnVuL2Zvcm1hdHRhYmxlLWFkYXB0ZXInO1xuXG5jb25zdCBERUZBVUxUX0FUVEVNUFRfTElNSVQgPSA1O1xuY29uc3QgREVGQVVMVF9USFJFU0hPTEQgICAgID0gMztcbmNvbnN0IE1JTl9BVFRFTVBUX0xJTUlUICAgICA9IDI7XG5jb25zdCBNSU5fU1VDQ0VTU19USFJFU0hPTEQgPSAxO1xuXG5mdW5jdGlvbiBfaXNRdWFyYW50aW5lT3B0aW9uIChvcHRpb246IHN0cmluZyk6IG9wdGlvbiBpcyBRVUFSQU5USU5FX09QVElPTl9OQU1FUyB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoUVVBUkFOVElORV9PUFRJT05fTkFNRVMpLmluY2x1ZGVzKG9wdGlvbiBhcyBRVUFSQU5USU5FX09QVElPTl9OQU1FUyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVF1YXJhbnRpbmVPcHRpb25zIChvcHRpb25zOiBEaWN0aW9uYXJ5PHN0cmluZyB8IG51bWJlcj4pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvcHRpb25zKSB7XG4gICAgICAgIGlmICghX2lzUXVhcmFudGluZU9wdGlvbihrZXkpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5pbnZhbGlkUXVhcmFudGluZU9wdGlvbiwga2V5KTtcbiAgICB9XG5cbiAgICBjb25zdCBhdHRlbXB0TGltaXQgICAgID0gdHlwZW9mIG9wdGlvbnMuYXR0ZW1wdExpbWl0ID09PSAnbnVtYmVyJyA/IG9wdGlvbnMuYXR0ZW1wdExpbWl0IDogREVGQVVMVF9BVFRFTVBUX0xJTUlUO1xuICAgIGNvbnN0IHN1Y2Nlc3NUaHJlc2hvbGQgPSB0eXBlb2Ygb3B0aW9ucy5zdWNjZXNzVGhyZXNob2xkID09PSAnbnVtYmVyJyA/IG9wdGlvbnMuc3VjY2Vzc1RocmVzaG9sZCA6IERFRkFVTFRfVEhSRVNIT0xEO1xuXG4gICAgaWYgKGF0dGVtcHRMaW1pdCA8IE1JTl9BVFRFTVBUX0xJTUlUKVxuICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEVycm9yKFJVTlRJTUVfRVJST1JTLmludmFsaWRBdHRlbXB0TGltaXRWYWx1ZSwgUVVBUkFOVElORV9PUFRJT05fTkFNRVMuYXR0ZW1wdExpbWl0LCBNSU5fQVRURU1QVF9MSU1JVCk7XG5cbiAgICBpZiAoc3VjY2Vzc1RocmVzaG9sZCA8IE1JTl9TVUNDRVNTX1RIUkVTSE9MRClcbiAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5pbnZhbGlkU3VjY2Vzc1RocmVzaG9sZFZhbHVlLCBRVUFSQU5USU5FX09QVElPTl9OQU1FUy5zdWNjZXNzVGhyZXNob2xkLCBNSU5fU1VDQ0VTU19USFJFU0hPTEQpO1xuXG4gICAgaWYgKHN1Y2Nlc3NUaHJlc2hvbGQgPj0gYXR0ZW1wdExpbWl0KVxuICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEVycm9yKFJVTlRJTUVfRVJST1JTLmludmFsaWRRdWFyYW50aW5lUGFyYW1ldGVyc1JhdGlvLCBhdHRlbXB0TGltaXQsIHN1Y2Nlc3NUaHJlc2hvbGQpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UXVhcmFudGluZU9wdGlvbnMgKG9wdGlvbk5hbWU6IHN0cmluZywgb3B0aW9uczogc3RyaW5nIHwgYm9vbGVhbiB8IERpY3Rpb25hcnk8c3RyaW5nIHwgbnVtYmVyPik6IFByb21pc2U8RGljdGlvbmFyeTxudW1iZXI+IHwgYm9vbGVhbj4ge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Jvb2xlYW4nKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGNvbnN0IHBhcnNlZE9wdGlvbnMgPSBhd2FpdCBiYXNlR2V0T3B0aW9ucyhvcHRpb25zLCB7XG4gICAgICAgIHNraXBPcHRpb25WYWx1ZVR5cGVDb252ZXJzaW9uOiB0cnVlLFxuXG4gICAgICAgIGFzeW5jIG9uT3B0aW9uUGFyc2VkIChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgICAgICAgICAgaWYgKCFrZXkgfHwgIXZhbHVlKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMub3B0aW9uVmFsdWVJc05vdFZhbGlkS2V5VmFsdWUsIG9wdGlvbk5hbWUpO1xuXG4gICAgICAgICAgICByZXR1cm4gTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHZhbGlkYXRlUXVhcmFudGluZU9wdGlvbnMocGFyc2VkT3B0aW9ucyk7XG5cbiAgICByZXR1cm4gcGFyc2VkT3B0aW9ucztcbn1cblxuXG5pbnRlcmZhY2UgQXR0ZW1wdFJlc3VsdCB7XG4gICAgZmFpbGVkVGltZXM6IG51bWJlcjtcbiAgICBwYXNzZWRUaW1lczogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgUXVhcmFudGluZUF0dGVtcHQge1xuICAgIHRlc3RSdW5JZDogc3RyaW5nO1xuICAgIGVycm9yczogVGVzdFJ1bkVycm9yRm9ybWF0dGFibGVBZGFwdGVyW107XG59XG5cbmV4cG9ydCBjbGFzcyBRdWFyYW50aW5lIHtcbiAgICBwdWJsaWMgYXR0ZW1wdHM6IFF1YXJhbnRpbmVBdHRlbXB0W107XG4gICAgcHVibGljIGF0dGVtcHRMaW1pdDogbnVtYmVyO1xuICAgIHB1YmxpYyBzdWNjZXNzVGhyZXNob2xkOiBudW1iZXI7XG4gICAgcHVibGljIGZhaWx1cmVUaHJlc2hvbGQ6IG51bWJlcjtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHRoaXMuYXR0ZW1wdHMgICAgICAgICA9IFtdO1xuICAgICAgICB0aGlzLmF0dGVtcHRMaW1pdCAgICAgPSBERUZBVUxUX0FUVEVNUFRfTElNSVQ7XG4gICAgICAgIHRoaXMuc3VjY2Vzc1RocmVzaG9sZCA9IERFRkFVTFRfVEhSRVNIT0xEO1xuICAgICAgICB0aGlzLmZhaWx1cmVUaHJlc2hvbGQgPSBERUZBVUxUX1RIUkVTSE9MRDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RmFpbGVkQXR0ZW1wdHMgKCk6IFF1YXJhbnRpbmVBdHRlbXB0W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5hdHRlbXB0cy5maWx0ZXIoKHsgZXJyb3JzIH0pID0+ICEhZXJyb3JzLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhc3NlZEF0dGVtcHRzICgpOiBRdWFyYW50aW5lQXR0ZW1wdFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXR0ZW1wdHMuZmlsdGVyKCh7IGVycm9ycyB9KSA9PiBlcnJvcnMubGVuZ3RoID09PSAwKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q3VzdG9tUGFyYW1ldGVycyAoYXR0ZW1wdExpbWl0OiBudW1iZXIgfCB1bmRlZmluZWQsIHN1Y2Nlc3NUaHJlc2hvbGQ6IG51bWJlciB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgICAgICBjb25zdCBuZWVkVG9VcGRhdGVUZXN0UnVuVGhyZXNob2xkICAgICAgICAgID0gdHlwZW9mIGF0dGVtcHRMaW1pdCA9PT0gJ251bWJlcic7XG4gICAgICAgIGNvbnN0IG5lZWRUb1VwZGF0ZVBhc3NlZFF1YXJhbnRpbmVUaHJlc2hvbGQgPSB0eXBlb2Ygc3VjY2Vzc1RocmVzaG9sZCA9PT0gJ251bWJlcic7XG4gICAgICAgIGNvbnN0IG5lZWRUb1JlY2FsY3VsYXRlRmFpbGVkVGhyZXNob2xkICAgICAgPSBuZWVkVG9VcGRhdGVUZXN0UnVuVGhyZXNob2xkIHx8IG5lZWRUb1VwZGF0ZVBhc3NlZFF1YXJhbnRpbmVUaHJlc2hvbGQ7XG5cbiAgICAgICAgaWYgKG5lZWRUb1VwZGF0ZVRlc3RSdW5UaHJlc2hvbGQpIHRoaXMuYXR0ZW1wdExpbWl0ID0gYXR0ZW1wdExpbWl0IGFzIG51bWJlcjtcbiAgICAgICAgaWYgKG5lZWRUb1VwZGF0ZVBhc3NlZFF1YXJhbnRpbmVUaHJlc2hvbGQpIHRoaXMuc3VjY2Vzc1RocmVzaG9sZCA9IHN1Y2Nlc3NUaHJlc2hvbGQgYXMgbnVtYmVyO1xuICAgICAgICBpZiAobmVlZFRvUmVjYWxjdWxhdGVGYWlsZWRUaHJlc2hvbGQpIHRoaXMuX3NldEZhaWxlZFRocmVzaG9sZCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXROZXh0QXR0ZW1wdE51bWJlciAoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXR0ZW1wdHMubGVuZ3RoICsgMTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNUaHJlc2hvbGRSZWFjaGVkIChleHRyYUVycm9ycz86IFRlc3RSdW5FcnJvckZvcm1hdHRhYmxlQWRhcHRlcltdKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHsgcGFzc2VkVGltZXMsIGZhaWxlZFRpbWVzIH0gPSB0aGlzLl9nZXRBdHRlbXB0c1Jlc3VsdChleHRyYUVycm9ycyk7XG5cbiAgICAgICAgY29uc3Qgc3VjY2Vzc1RocmVzaG9sZFJlYWNoZWQgPSBwYXNzZWRUaW1lcyA+PSB0aGlzLnN1Y2Nlc3NUaHJlc2hvbGQ7XG4gICAgICAgIGNvbnN0IGZhaWx1cmVUaHJlc2hvbGRSZWFjaGVkID0gZmFpbGVkVGltZXMgPj0gdGhpcy5mYWlsdXJlVGhyZXNob2xkO1xuXG4gICAgICAgIHJldHVybiBzdWNjZXNzVGhyZXNob2xkUmVhY2hlZCB8fCBmYWlsdXJlVGhyZXNob2xkUmVhY2hlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNGaXJzdEF0dGVtcHRTdWNjZXNzZnVsIChleHRyYUVycm9yczogVGVzdFJ1bkVycm9yRm9ybWF0dGFibGVBZGFwdGVyW10pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgeyBmYWlsZWRUaW1lcywgcGFzc2VkVGltZXMgfSA9IHRoaXMuX2dldEF0dGVtcHRzUmVzdWx0KGV4dHJhRXJyb3JzKTtcblxuICAgICAgICByZXR1cm4gZmFpbGVkVGltZXMgPT09IDAgJiYgcGFzc2VkVGltZXMgPiAwO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldEF0dGVtcHRzUmVzdWx0IChleHRyYUVycm9ycz86IFRlc3RSdW5FcnJvckZvcm1hdHRhYmxlQWRhcHRlcltdKTogQXR0ZW1wdFJlc3VsdCB7XG4gICAgICAgIGxldCBmYWlsZWRUaW1lcyA9IHRoaXMuZ2V0RmFpbGVkQXR0ZW1wdHMoKS5sZW5ndGg7XG4gICAgICAgIGxldCBwYXNzZWRUaW1lcyA9IHRoaXMuZ2V0UGFzc2VkQXR0ZW1wdHMoKS5sZW5ndGg7XG5cbiAgICAgICAgaWYgKGV4dHJhRXJyb3JzKSB7XG4gICAgICAgICAgICBpZiAoZXh0cmFFcnJvcnMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIGZhaWxlZFRpbWVzICs9IGV4dHJhRXJyb3JzLmxlbmd0aDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBwYXNzZWRUaW1lcyArPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgZmFpbGVkVGltZXMsIHBhc3NlZFRpbWVzIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0RmFpbGVkVGhyZXNob2xkICgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mYWlsdXJlVGhyZXNob2xkID0gdGhpcy5hdHRlbXB0TGltaXQgLSB0aGlzLnN1Y2Nlc3NUaHJlc2hvbGQgKyAxO1xuICAgIH1cbn1cbiJdfQ==