finalizeTwoFactor(secret, activationCode, callback) {
		let attemptsLeft = 30;
		let diff = 0;

		let self = this;
		return StdLib.Promises.timeoutCallbackPromise(15000, null, callback, (resolve, reject) => {
			SteamTotp.getTimeOffset((err, offset, latency) => {
				if (err) {
					return reject(err);
				}

				diff = offset;
				finalize();
			});

			function finalize() {
				let code = SteamTotp.generateAuthCode(secret, diff);

				self._sendUnified('TwoFactor.FinalizeAddAuthenticator#1', {
					steamid: self.steamID.getSteamID64(),
					authenticator_code: code,
					authenticator_time: Math.floor(Date.now() / 1000),
					activation_code: activationCode
				}, (body) => {
					if (body.server_time) {
						diff = parseInt(body.server_time, 10) - Math.floor(Date.now() / 1000);
					}

					if (body.status == 89) {
						return reject(new Error('Invalid activation code'));
					} else if (!body.success) {
						return reject(new Error('Error ' + body.status));
					} else if (body.want_more) {
						attemptsLeft--;
						diff += 30;

						if (attemptsLeft <= 0) {
							return reject(new Error('Failed to finalize adding authenticator after 30 attempts'));
						}

						finalize();
					} else {
						resolve();
					}
				});
			}
		});
	}
Finalize the process of enabling TOTP two-factor authentication
@param {Buffer|string} secret - Your shared secret
@param {string} activationCode - The activation code you got in your email
@param {function} [callback] - Called with a single Error argument, or null on success
@return {Promise}