contract Ownable {
    address public owner;

    event OwnershipRenounced(address indexed previousOwner);
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

/**
    * @dev El constructor Ownable establece el "propietario" original del contrato al remitente
    * cuenta.
    */
    constructor() public {
        owner = msg.sender;
    }

    /**
    * @dev Lanza si es llamado por cualquier cuenta que no sea el propietario.
    */
    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }
/**
    * @dev Permite al propietario actual transferir el control del contrato a un nuevo propietario.
    * @param newOwner La dirección a la que se transfiere la propiedad.
    */
    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0));
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
    }

    /**
    * @dev Permite al propietario actual ceder el control del contrato.
    */
    function renounceOwnership() public onlyOwner {
        emit OwnershipRenounced(owner);
        owner = address(0);
    }
}
/**
 * @title Ownable
 * @dev El contrato de propiedad tiene una dirección de propietario y proporciona un control de autorización básico
 * funciones, esto simplifica la implementación de "permisos de usuario".
 */
function renounceOwnership() public onlyOwner {
    emit OwnershipRenounced(owner);
    owner = address(0);
}

/**
 * @dev Permite al propietario actual ceder el control del contrato.
 */