contract Manageable is Ownable, Utils {
    mapping(address => bool) public isManager;     // manager accounts

    /** EVENTS **/
    event ChangedManager(address indexed manager, bool active);

    /** MODIFIERS **/
    modifier onlyManager() {
        require(isManager[msg.sender], "is not manager");
        _;
    }

    /**
    * @notice constructor sets the deployer as a manager
    */
    constructor() public {
        setManager(msg.sender, true);
    }

    /**
     * @notice enable/disable an account to be a manager
     * @param _manager address address of the manager to create/alter
     * @param _active bool flag that shows if the manager account is active
     */
    function setManager(address _manager, bool _active) public onlyOwner onlyValidAddress(_manager) {
        isManager[_manager] = _active;
        emit ChangedManager(_manager, _active);
    }

    /** OVERRIDE 
    * @notice does not allow owner to give up ownership
    */
    function renounceOwnership() public onlyOwner {
        revert("Cannot renounce ownership");
    }
}
function setManager(address _manager, bool _active) public onlyOwner onlyValidAddress(_manager) {
    isManager[_manager] = _active;
    emit ChangedManager(_manager, _active);
}

/**
 * @notice enable/disable an account to be a manager
 * @param _manager address address of the manager to create/alter
 * @param _active bool flag that shows if the manager account is active
 */