library SafeMath {
   /**
   * @dev Multiplies two numbers, revert()s on overflow.
   */
   function mul(uint256 a, uint256 b) internal returns (uint256 c) {
     if (a == 0) {
       return 0;
     }
     c = a * b;
     assert(c / a == b);
     return c;
   }

   /**
   * @dev Integer division of two numbers, truncating the quotient.
   */
   function div(uint256 a, uint256 b) internal returns (uint256) {
     // assert(b > 0); // Solidity automatically revert()s when dividing by 0
     // uint256 c = a / b;
     // assert(a == b * c + a % b); // There is no case in which this doesn't hold
     return a / b;
   }

   /**
   * @dev Subtracts two numbers, revert()s on overflow (i.e. if subtrahend is greater than minuend).
   */
   function sub(uint256 a, uint256 b) internal returns (uint256) {
     assert(b <= a);
     return a - b;
   }

   /**
   * @dev Adds two numbers, revert()s on overflow.
   */
   function add(uint256 a, uint256 b) internal returns (uint256 c) {
     c = a + b;
     assert(c >= a && c >= b);
     return c;
   }

   function assert(bool assertion) internal {
     if (!assertion) {
       revert();
     }
   }
 }
/**
 * Math operations with safety checks
 */
function mul(uint256 a, uint256 b) internal returns (uint256 c) {
  if (a == 0) {
    return 0;
  }
  c = a * b;
  assert(c / a == b);
  return c;
}

/**
 * @dev Multiplies two numbers, revert()s on overflow.
 */