{"sources":{"OneInch.sol":{"content":"/*\r\n                                        ,▄m    ,▄▄▄▄▄▄▄▄▄▄╖\r\n                                    ╓▄▓██▌╓▄▓███████████▀└\r\n                                  ▄████████████▓╬▓███████████▓▓▓▄▄▄,\r\n              ╓,              ,▄▄███▓╣██████▓╬╬▓████████████▀▓████████▓▄,\r\n               ▀█▓▄╥       xΘ╙╠╠███▓╬▓█████╬╬╬▓██████▓╬╬╬▓▀  ▐█╬╬╬╬▓██████▌╖\r\n                 ╙████▓▄Q  ,φ▒▒▒███╬╬█████╬╬╬▓████▓╬╬╬▓▓▀  ╕ ▐█▓▓▓╬╬╬╬╬▓█████▄\r\n                   ╙▓██████▓▄▄▒▒███╬╬╣████╬╬╣███╬╬▓███▀  ▄█⌐ ╫████████▓▓╬╬╬████▌\r\n                   /  ▀███▓████████▓╬╬▓████╬███▓████▀  ▄██▀ ╔██████████████▓▓▓███▄\r\n                 ▄╙     ╙██▓▄╙▀▓█████▓▓▓██████████▀  ª▀▀└ ,▓███████▓╬╬╬▓██████████▌\r\n               ,▓   ╓╠▒≥  ╙▓██▓╖ └▀▓███████▓███▓╙       ▄▓████████████▓╬╬╬╬▓███████▌\r\n              ▄█   ╔▒▒▒▒\"   └▀███▌,  ╙████▀         ~Φ▓██▓▀▀╩▓██╙▀██████▓╬╬╬╬▓██████▌\r\n             ▓█   φ▒▒▒╙    ╔╔  ╙████▄▄███▀          ,         ██▌   ╙▓█████╬╬╬╬▓██▓└▀b\r\n            ▓█   ╔▒▒▒`    φ▒▒▒ⁿ  ╫██████`         ,▌          ╫██      ╙█████╬╬╬╬██▓\r\n           ╫█─  .▒▒▒     ╠▒▒╚   ]██████¬         ▓█            ██▌       └▓███▓╬╬╬██▓\r\n          ▐█▌   ╠▒▒     φ▒▒\"    ▐█████─        ▓█▀██▌          ███       ╬ └████╬╬╬██▌\r\n          ██   ]▒▒⌐    .▒▒       ▓████       ▄█▀┤░▐██        ╓███▀      /╫▒ε ╙███╬╬╣██\r\n         ▐██   ╚▒╚     ╠▒        ║████⌐ ╟▄,▓█▓┤Q▄▓█▀        ▄▀▓▓`      ╓▒▓▌▒╔ └███╬╬██▌\r\n         ▓█▌   ▒▒      ▒╙        ██████ ╫████▓▀▀╙          ▓         ,φ▒║█▌▒▒≥  ███╬▓██\r\n         ██▌   ▒▒      ▒        ▐███╙██b └╙          ▄ÆR▀▀▀       ╓φ╠▒▒▄██▒▒▒▒  ╙███╣██\r\n         ██▌   ▒Γ      ╙        ███▌ ╟█            ,▓,φφ╠▒▒▒▒▒▒▒▒▒▒▒▄▓███▀▒▒▒▒╠  ▓██▓██─\r\n         ██▌   ╚⌐      ⌐       ▓███               ╔▌«▒▒▒▒▄▓████████████▀░▒▒▒▒▒▒  ▐█████\r\n         ███   'ε             ]███⌐             ╓▄▀φ▒▒▒▄▓█████████▓▀╬░▒▒▒▒▒▒▒▒▒   █████\r\n         ╫██µ   φ             ███▌        ╓╔φ╠▒░▓,╠▒▒▒▓███████▀  ╙█▓▄`╙╠▒▒▒▒▒▒▒   █████\r\n         └███                ╫███       ,╠▒▒▄▓▓█▓▓▓▄▄███████▀      ▓██▌,`╚▒▒▒▒▒  ]████▌\r\n          ▓██▌              ▓███¬   ╔  φ▒▒▒╠╠╠╠╬▓████████▓╙         ████▌  ╚▒▒╙  ▓████\r\n           ███▄           ▄███▀  ╒  ╠≥╠▒▒▒░▄▓▌╨╚▒╚▓█████└           ║█████  └▒  ]████`\r\n           └███▌         ▓███╙  ▓▄  ╠▒▒▒▒▒██╙╙▓▓ ▒▒████             ▐██████    ,████╨\r\n            └███▌       ▐███  ╔███  ╠▒▒▒▒╫█⌐,▄▓▓ ▒▒▓██▌             ╫██████▓  ╓████▀\r\n              ████µ      ███b  ▀╙  φ▒▒▒▒▄██▓▓╠φ╠▒▒▓███             ]████████⌐▄████┘\r\n               ▀███▌     ╫███  .╔φ▒▒▒▒▒▓█▓╬░▒▒▄▓████▀              █████████████▓\r\n                ╙████▌    ▓██▓▄,   ▐▓▓██▄▄▄▄▓████▀└              ,█████████████▀\r\n                  ╙████▌µ  ╙▀████████████████▓▀                 ▄████████████▀\r\n                    ╙█████▄,   └╙╙▀▀╙                         ▄████████████▀\r\n                      └▀█████▓▄                            ▄▓███████████▀╙\r\n                         ╙▀██████▓▄▄,                 ,▄▓▓███████████▀╙\r\n                             ╙▀█████████▓▓▓▓▓▓▓▓▓▓▓██████████████▀▀└\r\n                                 ╙╙▀▓███████████████████████▀▀╙\r\n                                        └╙╙╙▀▀▀▀▀▀▀▀▀╙╙└\r\n\r\n         ██╗██╗███╗   ██╗ ██████╗██╗  ██╗    ████████╗ ██████╗ ██╗  ██╗███████╗███╗   ██╗\r\n        ███║██║████╗  ██║██╔════╝██║  ██║    ╚══██╔══╝██╔═══██╗██║ ██╔╝██╔════╝████╗  ██║\r\n        ╚██║██║██╔██╗ ██║██║     ███████║       ██║   ██║   ██║█████╔╝ █████╗  ██╔██╗ ██║\r\n         ██║██║██║╚██╗██║██║     ██╔══██║       ██║   ██║   ██║██╔═██╗ ██╔══╝  ██║╚██╗██║\r\n         ██║██║██║ ╚████║╚██████╗██║  ██║       ██║   ╚██████╔╝██║  ██╗███████╗██║ ╚████║\r\n         ╚═╝╚═╝╚═╝  ╚═══╝ ╚═════╝╚═╝  ╚═╝       ╚═╝    ╚═════╝ ╚═╝  ╚═╝╚══════╝╚═╝  ╚═══╝\r\n*/\r\n// File: @openzeppelin/contracts/GSN/Context.sol\r\n\r\n// SPDX-License-Identifier: MIT\r\n\r\npragma solidity >=0.6.0 <0.8.0;\r\n\r\n/*\r\n * @dev Provides information about the current execution context, including the\r\n * sender of the transaction and its data. While these are generally available\r\n * via msg.sender and msg.data, they should not be accessed in such a direct\r\n * manner, since when dealing with GSN meta-transactions the account sending and\r\n * paying for execution may not be the actual sender (as far as an application\r\n * is concerned).\r\n *\r\n * This contract is only required for intermediate, library-like contracts.\r\n */\r\nabstract contract Context {\r\n    function _msgSender() internal view virtual returns (address payable) {\r\n        return msg.sender;\r\n    }\r\n\r\n    function _msgData() internal view virtual returns (bytes memory) {\r\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\r\n        return msg.data;\r\n    }\r\n}\r\n\r\n// File: @openzeppelin/contracts/token/ERC20/IERC20.sol\r\n\r\n\r\npragma solidity >=0.6.0 <0.8.0;\r\n\r\n/**\r\n * @dev Interface of the ERC20 standard as defined in the EIP.\r\n */\r\ninterface IERC20 {\r\n    /**\r\n     * @dev Returns the amount of tokens in existence.\r\n     */\r\n    function totalSupply() external view returns (uint256);\r\n\r\n    /**\r\n     * @dev Returns the amount of tokens owned by `account`.\r\n     */\r\n    function balanceOf(address account) external view returns (uint256);\r\n\r\n    /**\r\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\r\n     *\r\n     * Returns a boolean value indicating whether the operation succeeded.\r\n     *\r\n     * Emits a {Transfer} event.\r\n     */\r\n    function transfer(address recipient, uint256 amount) external returns (bool);\r\n\r\n    /**\r\n     * @dev Returns the remaining number of tokens that `spender` will be\r\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\r\n     * zero by default.\r\n     *\r\n     * This value changes when {approve} or {transferFrom} are called.\r\n     */\r\n    function allowance(address owner, address spender) external view returns (uint256);\r\n\r\n    /**\r\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\r\n     *\r\n     * Returns a boolean value indicating whether the operation succeeded.\r\n     *\r\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\r\n     * that someone may use both the old and the new allowance by unfortunate\r\n     * transaction ordering. One possible solution to mitigate this race\r\n     * condition is to first reduce the spender's allowance to 0 and set the\r\n     * desired value afterwards:\r\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\r\n     *\r\n     * Emits an {Approval} event.\r\n     */\r\n    function approve(address spender, uint256 amount) external returns (bool);\r\n\r\n    /**\r\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\r\n     * allowance mechanism. `amount` is then deducted from the caller's\r\n     * allowance.\r\n     *\r\n     * Returns a boolean value indicating whether the operation succeeded.\r\n     *\r\n     * Emits a {Transfer} event.\r\n     */\r\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\r\n\r\n    /**\r\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\r\n     * another (`to`).\r\n     *\r\n     * Note that `value` may be zero.\r\n     */\r\n    event Transfer(address indexed from, address indexed to, uint256 value);\r\n\r\n    /**\r\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\r\n     * a call to {approve}. `value` is the new allowance.\r\n     */\r\n    event Approval(address indexed owner, address indexed spender, uint256 value);\r\n}\r\n\r\n// File: @openzeppelin/contracts/math/SafeMath.sol\r\n\r\n\r\npragma solidity >=0.6.0 <0.8.0;\r\n\r\n/**\r\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\r\n * checks.\r\n *\r\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\r\n * in bugs, because programmers usually assume that an overflow raises an\r\n * error, which is the standard behavior in high level programming languages.\r\n * `SafeMath` restores this intuition by reverting the transaction when an\r\n * operation overflows.\r\n *\r\n * Using this library instead of the unchecked operations eliminates an entire\r\n * class of bugs, so it's recommended to use it always.\r\n */\r\nlibrary SafeMath {\r\n    /**\r\n     * @dev Returns the addition of two unsigned integers, reverting on\r\n     * overflow.\r\n     *\r\n     * Counterpart to Solidity's `+` operator.\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - Addition cannot overflow.\r\n     */\r\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\r\n        uint256 c = a + b;\r\n        require(c >= a, \"SafeMath: addition overflow\");\r\n\r\n        return c;\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the subtraction of two unsigned integers, reverting on\r\n     * overflow (when the result is negative).\r\n     *\r\n     * Counterpart to Solidity's `-` operator.\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - Subtraction cannot overflow.\r\n     */\r\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\r\n        return sub(a, b, \"SafeMath: subtraction overflow\");\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\r\n     * overflow (when the result is negative).\r\n     *\r\n     * Counterpart to Solidity's `-` operator.\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - Subtraction cannot overflow.\r\n     */\r\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\r\n        require(b <= a, errorMessage);\r\n        uint256 c = a - b;\r\n\r\n        return c;\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the multiplication of two unsigned integers, reverting on\r\n     * overflow.\r\n     *\r\n     * Counterpart to Solidity's `*` operator.\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - Multiplication cannot overflow.\r\n     */\r\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\r\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\r\n        // benefit is lost if 'b' is also tested.\r\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\r\n        if (a == 0) {\r\n            return 0;\r\n        }\r\n\r\n        uint256 c = a * b;\r\n        require(c / a == b, \"SafeMath: multiplication overflow\");\r\n\r\n        return c;\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the integer division of two unsigned integers. Reverts on\r\n     * division by zero. The result is rounded towards zero.\r\n     *\r\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\r\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\r\n     * uses an invalid opcode to revert (consuming all remaining gas).\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - The divisor cannot be zero.\r\n     */\r\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\r\n        return div(a, b, \"SafeMath: division by zero\");\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\r\n     * division by zero. The result is rounded towards zero.\r\n     *\r\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\r\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\r\n     * uses an invalid opcode to revert (consuming all remaining gas).\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - The divisor cannot be zero.\r\n     */\r\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\r\n        require(b > 0, errorMessage);\r\n        uint256 c = a / b;\r\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\r\n\r\n        return c;\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\r\n     * Reverts when dividing by zero.\r\n     *\r\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\r\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\r\n     * invalid opcode to revert (consuming all remaining gas).\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - The divisor cannot be zero.\r\n     */\r\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\r\n        return mod(a, b, \"SafeMath: modulo by zero\");\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\r\n     * Reverts with custom message when dividing by zero.\r\n     *\r\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\r\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\r\n     * invalid opcode to revert (consuming all remaining gas).\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - The divisor cannot be zero.\r\n     */\r\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\r\n        require(b != 0, errorMessage);\r\n        return a % b;\r\n    }\r\n}\r\n\r\n// File: @openzeppelin/contracts/token/ERC20/ERC20.sol\r\n\r\n\r\npragma solidity >=0.6.0 <0.8.0;\r\n\r\n\r\n\r\n\r\n/**\r\n * @dev Implementation of the {IERC20} interface.\r\n *\r\n * This implementation is agnostic to the way tokens are created. This means\r\n * that a supply mechanism has to be added in a derived contract using {_mint}.\r\n * For a generic mechanism see {ERC20PresetMinterPauser}.\r\n *\r\n * TIP: For a detailed writeup see our guide\r\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\r\n * to implement supply mechanisms].\r\n *\r\n * We have followed general OpenZeppelin guidelines: functions revert instead\r\n * of returning `false` on failure. This behavior is nonetheless conventional\r\n * and does not conflict with the expectations of ERC20 applications.\r\n *\r\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\r\n * This allows applications to reconstruct the allowance for all accounts just\r\n * by listening to said events. Other implementations of the EIP may not emit\r\n * these events, as it isn't required by the specification.\r\n *\r\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\r\n * functions have been added to mitigate the well-known issues around setting\r\n * allowances. See {IERC20-approve}.\r\n */\r\ncontract ERC20 is Context, IERC20 {\r\n    using SafeMath for uint256;\r\n\r\n    mapping (address => uint256) private _balances;\r\n\r\n    mapping (address => mapping (address => uint256)) private _allowances;\r\n\r\n    uint256 private _totalSupply;\r\n\r\n    string private _name;\r\n    string private _symbol;\r\n    uint8 private _decimals;\r\n\r\n    /**\r\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\r\n     * a default value of 18.\r\n     *\r\n     * To select a different value for {decimals}, use {_setupDecimals}.\r\n     *\r\n     * All three of these values are immutable: they can only be set once during\r\n     * construction.\r\n     */\r\n    constructor (string memory name_, string memory symbol_) public {\r\n        _name = name_;\r\n        _symbol = symbol_;\r\n        _decimals = 18;\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the name of the token.\r\n     */\r\n    function name() public view returns (string memory) {\r\n        return _name;\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the symbol of the token, usually a shorter version of the\r\n     * name.\r\n     */\r\n    function symbol() public view returns (string memory) {\r\n        return _symbol;\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the number of decimals used to get its user representation.\r\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\r\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\r\n     *\r\n     * Tokens usually opt for a value of 18, imitating the relationship between\r\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\r\n     * called.\r\n     *\r\n     * NOTE: This information is only used for _display_ purposes: it in\r\n     * no way affects any of the arithmetic of the contract, including\r\n     * {IERC20-balanceOf} and {IERC20-transfer}.\r\n     */\r\n    function decimals() public view returns (uint8) {\r\n        return _decimals;\r\n    }\r\n\r\n    /**\r\n     * @dev See {IERC20-totalSupply}.\r\n     */\r\n    function totalSupply() public view override returns (uint256) {\r\n        return _totalSupply;\r\n    }\r\n\r\n    /**\r\n     * @dev See {IERC20-balanceOf}.\r\n     */\r\n    function balanceOf(address account) public view override returns (uint256) {\r\n        return _balances[account];\r\n    }\r\n\r\n    /**\r\n     * @dev See {IERC20-transfer}.\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - `recipient` cannot be the zero address.\r\n     * - the caller must have a balance of at least `amount`.\r\n     */\r\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\r\n        _transfer(_msgSender(), recipient, amount);\r\n        return true;\r\n    }\r\n\r\n    /**\r\n     * @dev See {IERC20-allowance}.\r\n     */\r\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\r\n        return _allowances[owner][spender];\r\n    }\r\n\r\n    /**\r\n     * @dev See {IERC20-approve}.\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - `spender` cannot be the zero address.\r\n     */\r\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\r\n        _approve(_msgSender(), spender, amount);\r\n        return true;\r\n    }\r\n\r\n    /**\r\n     * @dev See {IERC20-transferFrom}.\r\n     *\r\n     * Emits an {Approval} event indicating the updated allowance. This is not\r\n     * required by the EIP. See the note at the beginning of {ERC20}.\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - `sender` and `recipient` cannot be the zero address.\r\n     * - `sender` must have a balance of at least `amount`.\r\n     * - the caller must have allowance for ``sender``'s tokens of at least\r\n     * `amount`.\r\n     */\r\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\r\n        _transfer(sender, recipient, amount);\r\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \"ERC20: transfer amount exceeds allowance\"));\r\n        return true;\r\n    }\r\n\r\n    /**\r\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\r\n     *\r\n     * This is an alternative to {approve} that can be used as a mitigation for\r\n     * problems described in {IERC20-approve}.\r\n     *\r\n     * Emits an {Approval} event indicating the updated allowance.\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - `spender` cannot be the zero address.\r\n     */\r\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\r\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\r\n        return true;\r\n    }\r\n\r\n    /**\r\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\r\n     *\r\n     * This is an alternative to {approve} that can be used as a mitigation for\r\n     * problems described in {IERC20-approve}.\r\n     *\r\n     * Emits an {Approval} event indicating the updated allowance.\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - `spender` cannot be the zero address.\r\n     * - `spender` must have allowance for the caller of at least\r\n     * `subtractedValue`.\r\n     */\r\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\r\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \"ERC20: decreased allowance below zero\"));\r\n        return true;\r\n    }\r\n\r\n    /**\r\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\r\n     *\r\n     * This is internal function is equivalent to {transfer}, and can be used to\r\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\r\n     *\r\n     * Emits a {Transfer} event.\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - `sender` cannot be the zero address.\r\n     * - `recipient` cannot be the zero address.\r\n     * - `sender` must have a balance of at least `amount`.\r\n     */\r\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\r\n        require(sender != address(0), \"ERC20: transfer from the zero address\");\r\n        require(recipient != address(0), \"ERC20: transfer to the zero address\");\r\n\r\n        _beforeTokenTransfer(sender, recipient, amount);\r\n\r\n        _balances[sender] = _balances[sender].sub(amount, \"ERC20: transfer amount exceeds balance\");\r\n        _balances[recipient] = _balances[recipient].add(amount);\r\n        emit Transfer(sender, recipient, amount);\r\n    }\r\n\r\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\r\n     * the total supply.\r\n     *\r\n     * Emits a {Transfer} event with `from` set to the zero address.\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - `to` cannot be the zero address.\r\n     */\r\n    function _mint(address account, uint256 amount) internal virtual {\r\n        require(account != address(0), \"ERC20: mint to the zero address\");\r\n\r\n        _beforeTokenTransfer(address(0), account, amount);\r\n\r\n        _totalSupply = _totalSupply.add(amount);\r\n        _balances[account] = _balances[account].add(amount);\r\n        emit Transfer(address(0), account, amount);\r\n    }\r\n\r\n    /**\r\n     * @dev Destroys `amount` tokens from `account`, reducing the\r\n     * total supply.\r\n     *\r\n     * Emits a {Transfer} event with `to` set to the zero address.\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - `account` cannot be the zero address.\r\n     * - `account` must have at least `amount` tokens.\r\n     */\r\n    function _burn(address account, uint256 amount) internal virtual {\r\n        require(account != address(0), \"ERC20: burn from the zero address\");\r\n\r\n        _beforeTokenTransfer(account, address(0), amount);\r\n\r\n        _balances[account] = _balances[account].sub(amount, \"ERC20: burn amount exceeds balance\");\r\n        _totalSupply = _totalSupply.sub(amount);\r\n        emit Transfer(account, address(0), amount);\r\n    }\r\n\r\n    /**\r\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\r\n     *\r\n     * This internal function is equivalent to `approve`, and can be used to\r\n     * e.g. set automatic allowances for certain subsystems, etc.\r\n     *\r\n     * Emits an {Approval} event.\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - `owner` cannot be the zero address.\r\n     * - `spender` cannot be the zero address.\r\n     */\r\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\r\n        require(owner != address(0), \"ERC20: approve from the zero address\");\r\n        require(spender != address(0), \"ERC20: approve to the zero address\");\r\n\r\n        _allowances[owner][spender] = amount;\r\n        emit Approval(owner, spender, amount);\r\n    }\r\n\r\n    /**\r\n     * @dev Sets {decimals} to a value other than the default one of 18.\r\n     *\r\n     * WARNING: This function should only be called from the constructor. Most\r\n     * applications that interact with token contracts will not expect\r\n     * {decimals} to ever change, and may work incorrectly if it does.\r\n     */\r\n    function _setupDecimals(uint8 decimals_) internal {\r\n        _decimals = decimals_;\r\n    }\r\n\r\n    /**\r\n     * @dev Hook that is called before any transfer of tokens. This includes\r\n     * minting and burning.\r\n     *\r\n     * Calling conditions:\r\n     *\r\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\r\n     * will be to transferred to `to`.\r\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\r\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\r\n     * - `from` and `to` are never both zero.\r\n     *\r\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\r\n     */\r\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\r\n}\r\n\r\n// File: @openzeppelin/contracts/token/ERC20/ERC20Burnable.sol\r\n\r\n\r\npragma solidity >=0.6.0 <0.8.0;\r\n\r\n\r\n\r\n/**\r\n * @dev Extension of {ERC20} that allows token holders to destroy both their own\r\n * tokens and those that they have an allowance for, in a way that can be\r\n * recognized off-chain (via event analysis).\r\n */\r\nabstract contract ERC20Burnable is Context, ERC20 {\r\n    using SafeMath for uint256;\r\n\r\n    /**\r\n     * @dev Destroys `amount` tokens from the caller.\r\n     *\r\n     * See {ERC20-_burn}.\r\n     */\r\n    function burn(uint256 amount) public virtual {\r\n        _burn(_msgSender(), amount);\r\n    }\r\n\r\n    /**\r\n     * @dev Destroys `amount` tokens from `account`, deducting from the caller's\r\n     * allowance.\r\n     *\r\n     * See {ERC20-_burn} and {ERC20-allowance}.\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - the caller must have allowance for ``accounts``'s tokens of at least\r\n     * `amount`.\r\n     */\r\n    function burnFrom(address account, uint256 amount) public virtual {\r\n        uint256 decreasedAllowance = allowance(account, _msgSender()).sub(amount, \"ERC20: burn amount exceeds allowance\");\r\n\r\n        _approve(account, _msgSender(), decreasedAllowance);\r\n        _burn(account, amount);\r\n    }\r\n}\r\n\r\n// File: @openzeppelin/contracts/access/Ownable.sol\r\n\r\n\r\npragma solidity >=0.6.0 <0.8.0;\r\n\r\n/**\r\n * @dev Contract module which provides a basic access control mechanism, where\r\n * there is an account (an owner) that can be granted exclusive access to\r\n * specific functions.\r\n *\r\n * By default, the owner account will be the one that deploys the contract. This\r\n * can later be changed with {transferOwnership}.\r\n *\r\n * This module is used through inheritance. It will make available the modifier\r\n * `onlyOwner`, which can be applied to your functions to restrict their use to\r\n * the owner.\r\n */\r\nabstract contract Ownable is Context {\r\n    address private _owner;\r\n\r\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\r\n\r\n    /**\r\n     * @dev Initializes the contract setting the deployer as the initial owner.\r\n     */\r\n    constructor () internal {\r\n        address msgSender = _msgSender();\r\n        _owner = msgSender;\r\n        emit OwnershipTransferred(address(0), msgSender);\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the address of the current owner.\r\n     */\r\n    function owner() public view returns (address) {\r\n        return _owner;\r\n    }\r\n\r\n    /**\r\n     * @dev Throws if called by any account other than the owner.\r\n     */\r\n    modifier onlyOwner() {\r\n        require(_owner == _msgSender(), \"Ownable: caller is not the owner\");\r\n        _;\r\n    }\r\n\r\n    /**\r\n     * @dev Leaves the contract without owner. It will not be possible to call\r\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\r\n     *\r\n     * NOTE: Renouncing ownership will leave the contract without an owner,\r\n     * thereby removing any functionality that is only available to the owner.\r\n     */\r\n    function renounceOwnership() public virtual onlyOwner {\r\n        emit OwnershipTransferred(_owner, address(0));\r\n        _owner = address(0);\r\n    }\r\n\r\n    /**\r\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\r\n     * Can only be called by the current owner.\r\n     */\r\n    function transferOwnership(address newOwner) public virtual onlyOwner {\r\n        require(newOwner != address(0), \"Ownable: new owner is the zero address\");\r\n        emit OwnershipTransferred(_owner, newOwner);\r\n        _owner = newOwner;\r\n    }\r\n}\r\n\r\n// File: @openzeppelin/contracts/utils/Counters.sol\r\n\r\n\r\npragma solidity >=0.6.0 <0.8.0;\r\n\r\n\r\n/**\r\n * @title Counters\r\n * @author Matt Condon (@shrugs)\r\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\r\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\r\n *\r\n * Include with `using Counters for Counters.Counter;`\r\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\r\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\r\n * directly accessed.\r\n */\r\nlibrary Counters {\r\n    using SafeMath for uint256;\r\n\r\n    struct Counter {\r\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\r\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\r\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\r\n        uint256 _value; // default: 0\r\n    }\r\n\r\n    function current(Counter storage counter) internal view returns (uint256) {\r\n        return counter._value;\r\n    }\r\n\r\n    function increment(Counter storage counter) internal {\r\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\r\n        counter._value += 1;\r\n    }\r\n\r\n    function decrement(Counter storage counter) internal {\r\n        counter._value = counter._value.sub(1);\r\n    }\r\n}\r\n\r\n// File: contracts/IERC20Permit.sol\r\n\r\n\r\npragma solidity ^0.6.0;\r\n\r\n// A copy of https://github.com/OpenZeppelin/openzeppelin-contracts/blob/ecc66719bd7681ed4eb8bf406f89a7408569ba9b/contracts/drafts/IERC20Permit.sol\r\n\r\n/**\r\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\r\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\r\n *\r\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\r\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\r\n * need to send a transaction, and thus is not required to hold Ether at all.\r\n */\r\ninterface IERC20Permit {\r\n    /**\r\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\r\n     * given `owner`'s signed approval.\r\n     *\r\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\r\n     * ordering also apply here.\r\n     *\r\n     * Emits an {Approval} event.\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - `spender` cannot be the zero address.\r\n     * - `deadline` must be a timestamp in the future.\r\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\r\n     * over the EIP712-formatted function arguments.\r\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\r\n     *\r\n     * For more information on the signature format, see the\r\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\r\n     * section].\r\n     */\r\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\r\n\r\n    /**\r\n     * @dev Returns the current nonce for `owner`. This value must be\r\n     * included whenever a signature is generated for {permit}.\r\n     *\r\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\r\n     * prevents a signature from being used multiple times.\r\n     */\r\n    function nonces(address owner) external view returns (uint256);\r\n\r\n    /**\r\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\r\n     */\r\n    // solhint-disable-next-line func-name-mixedcase\r\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\r\n}\r\n\r\n// File: contracts/ECDSA.sol\r\n\r\n\r\npragma solidity ^0.6.0;\r\n\r\n// A copy of https://github.com/OpenZeppelin/openzeppelin-contracts/blob/ecc66719bd7681ed4eb8bf406f89a7408569ba9b/contracts/cryptography/ECDSA.sol\r\n\r\n/**\r\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\r\n *\r\n * These functions can be used to verify that a message was signed by the holder\r\n * of the private keys of a given address.\r\n */\r\nlibrary ECDSA {\r\n    /**\r\n     * @dev Returns the address that signed a hashed message (`hash`) with\r\n     * `signature`. This address can then be used for verification purposes.\r\n     *\r\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\r\n     * this function rejects them by requiring the `s` value to be in the lower\r\n     * half order, and the `v` value to be either 27 or 28.\r\n     *\r\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\r\n     * verification to be secure: it is possible to craft signatures that\r\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\r\n     * this is by receiving a hash of the original message (which may otherwise\r\n     * be too long), and then calling {toEthSignedMessageHash} on it.\r\n     */\r\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\r\n        // Check the signature length\r\n        if (signature.length != 65) {\r\n            revert(\"ECDSA: invalid signature length\");\r\n        }\r\n\r\n        // Divide the signature in r, s and v variables\r\n        bytes32 r;\r\n        bytes32 s;\r\n        uint8 v;\r\n\r\n        // ecrecover takes the signature parameters, and the only way to get them\r\n        // currently is to use assembly.\r\n        // solhint-disable-next-line no-inline-assembly\r\n        assembly {\r\n            r := mload(add(signature, 0x20))\r\n            s := mload(add(signature, 0x40))\r\n            v := byte(0, mload(add(signature, 0x60)))\r\n        }\r\n\r\n        return recover(hash, v, r, s);\r\n    }\r\n\r\n    /**\r\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\r\n     * `r` and `s` signature fields separately.\r\n     */\r\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\r\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\r\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\r\n        // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most\r\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\r\n        //\r\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\r\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\r\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\r\n        // these malleable signatures as well.\r\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \"ECDSA: invalid signature s value\");\r\n        require(v == 27 || v == 28, \"ECDSA: invalid signature v value\");\r\n\r\n        // If the signature is valid (and not malleable), return the signer address\r\n        address signer = ecrecover(hash, v, r, s);\r\n        require(signer != address(0), \"ECDSA: invalid signature\");\r\n\r\n        return signer;\r\n    }\r\n\r\n    /**\r\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\r\n     * replicates the behavior of the\r\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\r\n     * JSON-RPC method.\r\n     *\r\n     * See {recover}.\r\n     */\r\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\r\n        // 32 is the length in bytes of hash,\r\n        // enforced by the type signature above\r\n        return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\r\n    }\r\n}\r\n\r\n// File: contracts/EIP712.sol\r\n\r\n\r\npragma solidity ^0.6.0;\r\n\r\n// A copy of https://github.com/OpenZeppelin/openzeppelin-contracts/blob/ecc66719bd7681ed4eb8bf406f89a7408569ba9b/contracts/drafts/EIP712.sol\r\n\r\n/**\r\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\r\n *\r\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\r\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\r\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\r\n *\r\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\r\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\r\n * ({_hashTypedDataV4}).\r\n *\r\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\r\n * the chain id to protect against replay attacks on an eventual fork of the chain.\r\n *\r\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\r\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\r\n */\r\nabstract contract EIP712 {\r\n    /* solhint-disable var-name-mixedcase */\r\n    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\r\n    // invalidate the cached domain separator if the chain id changes.\r\n    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\r\n    uint256 private immutable _CACHED_CHAIN_ID;\r\n\r\n    bytes32 private immutable _HASHED_NAME;\r\n    bytes32 private immutable _HASHED_VERSION;\r\n    bytes32 private immutable _TYPE_HASH;\r\n    /* solhint-enable var-name-mixedcase */\r\n\r\n    /**\r\n     * @dev Initializes the domain separator and parameter caches.\r\n     *\r\n     * The meaning of `name` and `version` is specified in\r\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\r\n     *\r\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\r\n     * - `version`: the current major version of the signing domain.\r\n     *\r\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\r\n     * contract upgrade].\r\n     */\r\n    constructor(string memory name, string memory version) internal {\r\n        bytes32 hashedName = keccak256(bytes(name));\r\n        bytes32 hashedVersion = keccak256(bytes(version));\r\n        bytes32 typeHash = keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\");\r\n        _HASHED_NAME = hashedName;\r\n        _HASHED_VERSION = hashedVersion;\r\n        _CACHED_CHAIN_ID = _getChainId();\r\n        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\r\n        _TYPE_HASH = typeHash;\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the domain separator for the current chain.\r\n     */\r\n    function _domainSeparatorV4() internal view returns (bytes32) {\r\n        if (_getChainId() == _CACHED_CHAIN_ID) {\r\n            return _CACHED_DOMAIN_SEPARATOR;\r\n        } else {\r\n            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\r\n        }\r\n    }\r\n\r\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\r\n        return keccak256(\r\n            abi.encode(\r\n                typeHash,\r\n                name,\r\n                version,\r\n                _getChainId(),\r\n                address(this)\r\n            )\r\n        );\r\n    }\r\n\r\n    /**\r\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\r\n     * function returns the hash of the fully encoded EIP712 message for this domain.\r\n     *\r\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\r\n     *\r\n     * ```solidity\r\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\r\n     *     keccak256(\"Mail(address to,string contents)\"),\r\n     *     mailTo,\r\n     *     keccak256(bytes(mailContents))\r\n     * )));\r\n     * address signer = ECDSA.recover(digest, signature);\r\n     * ```\r\n     */\r\n    function _hashTypedDataV4(bytes32 structHash) internal view returns (bytes32) {\r\n        return keccak256(abi.encodePacked(\"\\x19\\x01\", _domainSeparatorV4(), structHash));\r\n    }\r\n\r\n    function _getChainId() private pure returns (uint256 chainId) {\r\n        // solhint-disable-next-line no-inline-assembly\r\n        assembly {\r\n            chainId := chainid()\r\n        }\r\n    }\r\n}\r\n\r\n// File: contracts/ERC20Permit.sol\r\n\r\n\r\npragma solidity ^0.6.0;\r\n\r\n\r\n\r\n\r\n\r\n\r\n// An adapted copy of https://github.com/OpenZeppelin/openzeppelin-contracts/blob/ecc66719bd7681ed4eb8bf406f89a7408569ba9b/contracts/drafts/ERC20Permit.sol\r\n\r\n/**\r\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\r\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\r\n *\r\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\r\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\r\n * need to send a transaction, and thus is not required to hold Ether at all.\r\n */\r\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\r\n    using Counters for Counters.Counter;\r\n\r\n    mapping (address => Counters.Counter) private _nonces;\r\n\r\n    // solhint-disable-next-line var-name-mixedcase\r\n    bytes32 private immutable _PERMIT_TYPEHASH = keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\r\n\r\n    /**\r\n     * @dev See {IERC20Permit-permit}.\r\n     */\r\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\r\n        // solhint-disable-next-line not-rely-on-time\r\n        require(block.timestamp <= deadline, \"ERC20Permit: expired deadline\");\r\n\r\n        bytes32 structHash = keccak256(\r\n            abi.encode(\r\n                _PERMIT_TYPEHASH,\r\n                owner,\r\n                spender,\r\n                value,\r\n                _nonces[owner].current(),\r\n                deadline\r\n            )\r\n        );\r\n\r\n        bytes32 hash = _hashTypedDataV4(structHash);\r\n\r\n        address signer = ECDSA.recover(hash, v, r, s);\r\n        require(signer == owner, \"ERC20Permit: invalid signature\");\r\n\r\n        _nonces[owner].increment();\r\n        _approve(owner, spender, value);\r\n    }\r\n\r\n    /**\r\n     * @dev See {IERC20Permit-nonces}.\r\n     */\r\n    function nonces(address owner) public view override returns (uint256) {\r\n        return _nonces[owner].current();\r\n    }\r\n\r\n    /**\r\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\r\n     */\r\n    // solhint-disable-next-line func-name-mixedcase\r\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\r\n        return _domainSeparatorV4();\r\n    }\r\n}\r\n\r\n// File: contracts/OneInch.sol\r\n\r\n\r\npragma solidity ^0.6.0;\r\n\r\n\r\n\r\n\r\n\r\ncontract OneInch is ERC20Permit, ERC20Burnable, Ownable {\r\n    constructor(address _owner) public ERC20(\"1INCH Token\", \"1INCH\") EIP712(\"1INCH Token\", \"1\") {\r\n        _mint(_owner, 1.5e9 ether);\r\n        transferOwnership(_owner);\r\n    }\r\n\r\n    function mint(address to, uint256 amount) external onlyOwner {\r\n        _mint(to, amount);\r\n    }\r\n}"}},"compilation":{"language":"Solidity","compiler":"solc","compilerVersion":"0.6.12+commit.27d51765","compilerSettings":{"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"optimizer":{"runs":1000000,"enabled":true},"evmVersion":"istanbul","remappings":[]},"name":"OneInch","fullyQualifiedName":"OneInch.sol:OneInch"},"runtimeBytecode":{"onchainBytecode":"0x608060405234801561001057600080fd5b506004361061016c5760003560e01c8063715018a6116100cd578063a457c2d711610081578063d505accf11610066578063d505accf146104a1578063dd62ed3e146104ff578063f2fde38b1461053a5761016c565b8063a457c2d71461042f578063a9059cbb146104685761016c565b80637ecebe00116100b25780637ecebe00146103c35780638da5cb5b146103f657806395d89b41146104275761016c565b8063715018a61461038257806379cc67901461038a5761016c565b80633644e5151161012457806340c10f191161010957806340c10f19146102f757806342966c681461033257806370a082311461034f5761016c565b80633644e515146102b657806339509351146102be5761016c565b806318160ddd1161015557806318160ddd1461023b57806323b872dd14610255578063313ce567146102985761016c565b806306fdde0314610171578063095ea7b3146101ee575b600080fd5b61017961056d565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101b357818101518382015260200161019b565b50505050905090810190601f1680156101e05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102276004803603604081101561020457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610622565b604080519115158252519081900360200190f35b61024361063f565b60408051918252519081900360200190f35b6102276004803603606081101561026b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610645565b6102a06106e6565b6040805160ff9092168252519081900360200190f35b6102436106ef565b610227600480360360408110156102d457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356106fe565b6103306004803603604081101561030d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610759565b005b6103306004803603602081101561034857600080fd5b50356107f8565b6102436004803603602081101561036557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661080c565b610330610834565b610330600480360360408110156103a057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610934565b610243600480360360208110156103d957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661098e565b6103fe6109c2565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101796109de565b6102276004803603604081101561044557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610a5d565b6102276004803603604081101561047e57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610ad2565b610330600480360360e08110156104b757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135610ae6565b6102436004803603604081101561051557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610d1f565b6103306004803603602081101561055057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610d57565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106175780601f106105ec57610100808354040283529160200191610617565b820191906000526020600020905b8154815290600101906020018083116105fa57829003601f168201915b505050505090505b90565b600061063661062f610f5d565b8484610f61565b50600192915050565b60025490565b60006106528484846110a8565b6106dc8461065e610f5d565b6106d785604051806060016040528060288152602001611a6e6028913973ffffffffffffffffffffffffffffffffffffffff8a166000908152600160205260408120906106a9610f5d565b73ffffffffffffffffffffffffffffffffffffffff1681526020810191909152604001600020549190611278565b610f61565b5060019392505050565b60055460ff1690565b60006106f9611329565b905090565b600061063661070b610f5d565b846106d7856001600061071c610f5d565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918c168152925290205490610ee2565b610761610f5d565b60075473ffffffffffffffffffffffffffffffffffffffff9081169116146107ea57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6107f482826113f3565b5050565b610809610803610f5d565b82611524565b50565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61083c610f5d565b60075473ffffffffffffffffffffffffffffffffffffffff9081169116146108c557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60075460405160009173ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600780547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b600061096b82604051806060016040528060248152602001611a96602491396109648661095f610f5d565b610d1f565b9190611278565b905061097f83610979610f5d565b83610f61565b6109898383611524565b505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526006602052604081206109bc9061166e565b92915050565b60075473ffffffffffffffffffffffffffffffffffffffff1690565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106175780601f106105ec57610100808354040283529160200191610617565b6000610636610a6a610f5d565b846106d785604051806060016040528060258152602001611b246025913960016000610a94610f5d565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918d16815292529020549190611278565b6000610636610adf610f5d565b84846110a8565b83421115610b5557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff871660009081526006602052604081207f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c990899089908990610bab9061166e565b89604051602001808781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200196505050505050506040516020818303038152906040528051906020012090506000610c2e82611672565b90506000610c3e828787876116d9565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cda57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8a166000908152600660205260409020610d08906118fc565b610d138a8a8a610f61565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b610d5f610f5d565b60075473ffffffffffffffffffffffffffffffffffffffff908116911614610de857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116610e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180611a006026913960400191505060405180910390fd5b60075460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600082820183811015610f5657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b3390565b73ffffffffffffffffffffffffffffffffffffffff8316610fcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180611b006024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216611039576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180611a266022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316611114576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180611adb6025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216611180576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806119bb6023913960400191505060405180910390fd5b61118b838383610989565b6111d581604051806060016040528060268152602001611a486026913973ffffffffffffffffffffffffffffffffffffffff86166000908152602081905260409020549190611278565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526020819052604080822093909355908416815220546112119082610ee2565b73ffffffffffffffffffffffffffffffffffffffff8084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115611321576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156112e65781810151838201526020016112ce565b50505050905090810190601f1680156113135780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60007f0000000000000000000000000000000000000000000000000000000000000001611354611905565b141561138157507fa9e572d7c103a339987674ba85d3bf220c2d3b50e12faa30581b80b4cd57342761061f565b6113ec7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f6866a1b3bd19f6f11a36f59b0695f22c22d5c4409a12053c9a747a31d67937bb7fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6611909565b905061061f565b73ffffffffffffffffffffffffffffffffffffffff821661147557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b61148160008383610989565b60025461148e9082610ee2565b60025573ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260409020546114c19082610ee2565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b73ffffffffffffffffffffffffffffffffffffffff8216611590576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180611aba6021913960400191505060405180910390fd5b61159c82600083610989565b6115e6816040518060600160405280602281526020016119de6022913973ffffffffffffffffffffffffffffffffffffffff85166000908152602081905260409020549190611278565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260409020556002546116199082611978565b60025560408051828152905160009173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b5490565b600061167c611329565b8260405160200180807f190100000000000000000000000000000000000000000000000000000000000081525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050919050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a082111561176a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f45434453413a20696e76616c6964207369676e617475726520732076616c7565604482015290519081900360640190fd5b8360ff16601b148061177f57508360ff16601c145b6117ea57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f45434453413a20696e76616c6964207369676e617475726520762076616c7565604482015290519081900360640190fd5b600060018686868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611846573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166118f357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b95945050505050565b80546001019055565b4690565b6000838383611916611905565b30604051602001808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001955050505050506040516020818303038152906040528051906020012090509392505050565b6000610f5683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061127856fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220fd77525d5811b0476c6aa859e8c0f6389de71d2535d9fc3cd235877d1b83694364736f6c634300060c0033","recompiledBytecode":"0x608060405234801561001057600080fd5b506004361061016c5760003560e01c8063715018a6116100cd578063a457c2d711610081578063d505accf11610066578063d505accf146104a1578063dd62ed3e146104ff578063f2fde38b1461053a5761016c565b8063a457c2d71461042f578063a9059cbb146104685761016c565b80637ecebe00116100b25780637ecebe00146103c35780638da5cb5b146103f657806395d89b41146104275761016c565b8063715018a61461038257806379cc67901461038a5761016c565b80633644e5151161012457806340c10f191161010957806340c10f19146102f757806342966c681461033257806370a082311461034f5761016c565b80633644e515146102b657806339509351146102be5761016c565b806318160ddd1161015557806318160ddd1461023b57806323b872dd14610255578063313ce567146102985761016c565b806306fdde0314610171578063095ea7b3146101ee575b600080fd5b61017961056d565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101b357818101518382015260200161019b565b50505050905090810190601f1680156101e05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102276004803603604081101561020457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610622565b604080519115158252519081900360200190f35b61024361063f565b60408051918252519081900360200190f35b6102276004803603606081101561026b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610645565b6102a06106e6565b6040805160ff9092168252519081900360200190f35b6102436106ef565b610227600480360360408110156102d457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356106fe565b6103306004803603604081101561030d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610759565b005b6103306004803603602081101561034857600080fd5b50356107f8565b6102436004803603602081101561036557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661080c565b610330610834565b610330600480360360408110156103a057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610934565b610243600480360360208110156103d957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661098e565b6103fe6109c2565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101796109de565b6102276004803603604081101561044557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610a5d565b6102276004803603604081101561047e57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610ad2565b610330600480360360e08110156104b757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135610ae6565b6102436004803603604081101561051557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610d1f565b6103306004803603602081101561055057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610d57565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106175780601f106105ec57610100808354040283529160200191610617565b820191906000526020600020905b8154815290600101906020018083116105fa57829003601f168201915b505050505090505b90565b600061063661062f610f5d565b8484610f61565b50600192915050565b60025490565b60006106528484846110a8565b6106dc8461065e610f5d565b6106d785604051806060016040528060288152602001611a6e6028913973ffffffffffffffffffffffffffffffffffffffff8a166000908152600160205260408120906106a9610f5d565b73ffffffffffffffffffffffffffffffffffffffff1681526020810191909152604001600020549190611278565b610f61565b5060019392505050565b60055460ff1690565b60006106f9611329565b905090565b600061063661070b610f5d565b846106d7856001600061071c610f5d565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918c168152925290205490610ee2565b610761610f5d565b60075473ffffffffffffffffffffffffffffffffffffffff9081169116146107ea57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6107f482826113f3565b5050565b610809610803610f5d565b82611524565b50565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61083c610f5d565b60075473ffffffffffffffffffffffffffffffffffffffff9081169116146108c557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60075460405160009173ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600780547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b600061096b82604051806060016040528060248152602001611a96602491396109648661095f610f5d565b610d1f565b9190611278565b905061097f83610979610f5d565b83610f61565b6109898383611524565b505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526006602052604081206109bc9061166e565b92915050565b60075473ffffffffffffffffffffffffffffffffffffffff1690565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106175780601f106105ec57610100808354040283529160200191610617565b6000610636610a6a610f5d565b846106d785604051806060016040528060258152602001611b246025913960016000610a94610f5d565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918d16815292529020549190611278565b6000610636610adf610f5d565b84846110a8565b83421115610b5557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff871660009081526006602052604081207f000000000000000000000000000000000000000000000000000000000000000090899089908990610bab9061166e565b89604051602001808781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200196505050505050506040516020818303038152906040528051906020012090506000610c2e82611672565b90506000610c3e828787876116d9565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cda57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8a166000908152600660205260409020610d08906118fc565b610d138a8a8a610f61565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b610d5f610f5d565b60075473ffffffffffffffffffffffffffffffffffffffff908116911614610de857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116610e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180611a006026913960400191505060405180910390fd5b60075460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600082820183811015610f5657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b3390565b73ffffffffffffffffffffffffffffffffffffffff8316610fcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180611b006024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216611039576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180611a266022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316611114576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180611adb6025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216611180576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806119bb6023913960400191505060405180910390fd5b61118b838383610989565b6111d581604051806060016040528060268152602001611a486026913973ffffffffffffffffffffffffffffffffffffffff86166000908152602081905260409020549190611278565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526020819052604080822093909355908416815220546112119082610ee2565b73ffffffffffffffffffffffffffffffffffffffff8084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115611321576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156112e65781810151838201526020016112ce565b50505050905090810190601f1680156113135780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60007f0000000000000000000000000000000000000000000000000000000000000000611354611905565b141561138157507f000000000000000000000000000000000000000000000000000000000000000061061f565b6113ec7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611909565b905061061f565b73ffffffffffffffffffffffffffffffffffffffff821661147557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b61148160008383610989565b60025461148e9082610ee2565b60025573ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260409020546114c19082610ee2565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b73ffffffffffffffffffffffffffffffffffffffff8216611590576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180611aba6021913960400191505060405180910390fd5b61159c82600083610989565b6115e6816040518060600160405280602281526020016119de6022913973ffffffffffffffffffffffffffffffffffffffff85166000908152602081905260409020549190611278565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260409020556002546116199082611978565b60025560408051828152905160009173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b5490565b600061167c611329565b8260405160200180807f190100000000000000000000000000000000000000000000000000000000000081525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050919050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a082111561176a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f45434453413a20696e76616c6964207369676e617475726520732076616c7565604482015290519081900360640190fd5b8360ff16601b148061177f57508360ff16601c145b6117ea57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f45434453413a20696e76616c6964207369676e617475726520762076616c7565604482015290519081900360640190fd5b600060018686868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611846573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166118f357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b95945050505050565b80546001019055565b4690565b6000838383611916611905565b30604051602001808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001955050505050506040516020818303038152906040528051906020012090509392505050565b6000610f5683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061127856fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212205af8cdcb5a944b722fea73a3a6645a4ac3868374dd93bd61a71b19304a8efe2f64736f6c634300060c0033","sourceMap":"46438:344:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18806:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20912:169;;;;;;;;;;;;;;;;-1:-1:-1;20912:169:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;19881:100;;;:::i;:::-;;;;;;;;;;;;;;;;21563:321;;;;;;;;;;;;;;;;-1:-1:-1;21563:321:0;;;;;;;;;;;;;;;;;;:::i;19733:83::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46245:115;;;:::i;22293:218::-;;;;;;;;;;;;;;;;-1:-1:-1;22293:218:0;;;;;;;;;:::i;46682:97::-;;;;;;;;;;;;;;;;-1:-1:-1;46682:97:0;;;;;;;;;:::i;:::-;;28152:91;;;;;;;;;;;;;;;;-1:-1:-1;28152:91:0;;:::i;20044:119::-;;;;;;;;;;;;;;;;-1:-1:-1;20044:119:0;;;;:::i;30615:148::-;;;:::i;28562:295::-;;;;;;;;;;;;;;;;-1:-1:-1;28562:295:0;;;;;;;;;:::i;45995:120::-;;;;;;;;;;;;;;;;-1:-1:-1;45995:120:0;;;;:::i;29973:79::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19008:87;;;:::i;23014:269::-;;;;;;;;;;;;;;;;-1:-1:-1;23014:269:0;;;;;;;;;:::i;20376:175::-;;;;;;;;;;;;;;;;-1:-1:-1;20376:175:0;;;;;;;;;:::i;45113:816::-;;;;;;;;;;;;;;;;-1:-1:-1;45113:816:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;20614:151::-;;;;;;;;;;;;;;;;-1:-1:-1;20614:151:0;;;;;;;;;;;:::i;30918:244::-;;;;;;;;;;;;;;;;-1:-1:-1;30918:244:0;;;;:::i;18806:83::-;18876:5;18869:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18843:13;;18869:12;;18876:5;;18869:12;;18876:5;18869:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18806:83;;:::o;20912:169::-;20995:4;21012:39;21021:12;:10;:12::i;:::-;21035:7;21044:6;21012:8;:39::i;:::-;-1:-1:-1;21069:4:0;20912:169;;;;:::o;19881:100::-;19961:12;;19881:100;:::o;21563:321::-;21669:4;21686:36;21696:6;21704:9;21715:6;21686:9;:36::i;:::-;21733:121;21742:6;21750:12;:10;:12::i;:::-;21764:89;21802:6;21764:89;;;;;;;;;;;;;;;;;:19;;;;;;;:11;:19;;;;;;21784:12;:10;:12::i;:::-;21764:33;;;;;;;;;;;;;-1:-1:-1;21764:33:0;;;:89;:37;:89::i;:::-;21733:8;:121::i;:::-;-1:-1:-1;21872:4:0;21563:321;;;;;:::o;19733:83::-;19799:9;;;;19733:83;:::o;46245:115::-;46305:7;46332:20;:18;:20::i;:::-;46325:27;;46245:115;:::o;22293:218::-;22381:4;22398:83;22407:12;:10;:12::i;:::-;22421:7;22430:50;22469:10;22430:11;:25;22442:12;:10;:12::i;:::-;22430:25;;;;;;;;;;;;;;;;;;-1:-1:-1;22430:25:0;;;:34;;;;;;;;;;;:38;:50::i;46682:97::-;30195:12;:10;:12::i;:::-;30185:6;;:22;:6;;;:22;;;30177:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46754:17:::1;46760:2;46764:6;46754:5;:17::i;:::-;46682:97:::0;;:::o;28152:91::-;28208:27;28214:12;:10;:12::i;:::-;28228:6;28208:5;:27::i;:::-;28152:91;:::o;20044:119::-;20137:18;;20110:7;20137:18;;;;;;;;;;;;20044:119::o;30615:148::-;30195:12;:10;:12::i;:::-;30185:6;;:22;:6;;;:22;;;30177:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30706:6:::1;::::0;30685:40:::1;::::0;30722:1:::1;::::0;30685:40:::1;30706:6;::::0;30685:40:::1;::::0;30722:1;;30685:40:::1;30736:6;:19:::0;;;::::1;::::0;;30615:148::o;28562:295::-;28639:26;28668:84;28705:6;28668:84;;;;;;;;;;;;;;;;;:32;28678:7;28687:12;:10;:12::i;:::-;28668:9;:32::i;:::-;:36;:84;:36;:84::i;:::-;28639:113;;28765:51;28774:7;28783:12;:10;:12::i;:::-;28797:18;28765:8;:51::i;:::-;28827:22;28833:7;28842:6;28827:5;:22::i;:::-;28562:295;;;:::o;45995:120::-;46083:14;;;46056:7;46083:14;;;:7;:14;;;;;:24;;:22;:24::i;:::-;46076:31;45995:120;-1:-1:-1;;45995:120:0:o;29973:79::-;30038:6;;;;29973:79;:::o;19008:87::-;19080:7;19073:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19047:13;;19073:14;;19080:7;;19073:14;;19080:7;19073:14;;;;;;;;;;;;;;;;;;;;;;;;23014:269;23107:4;23124:129;23133:12;:10;:12::i;:::-;23147:7;23156:96;23195:15;23156:96;;;;;;;;;;;;;;;;;:11;:25;23168:12;:10;:12::i;:::-;23156:25;;;;;;;;;;;;;;;;;;-1:-1:-1;23156:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;20376:175::-;20462:4;20479:42;20489:12;:10;:12::i;:::-;20503:9;20514:6;20479:9;:42::i;45113:816::-;45342:8;45323:15;:27;;45315:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45580:14;;;45397:18;45580:14;;;:7;:14;;;;;45471:16;;45506:5;;45530:7;;45556:5;;45580:24;;:22;:24::i;:::-;45623:8;45442:204;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45418:239;;;;;;45397:260;;45670:12;45685:28;45702:10;45685:16;:28::i;:::-;45670:43;;45726:14;45743:28;45757:4;45763:1;45766;45769;45743:13;:28::i;:::-;45726:45;;45800:5;45790:15;;:6;:15;;;45782:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45853:14;;;;;;;:7;:14;;;;;:26;;:24;:26::i;:::-;45890:31;45899:5;45906:7;45915:5;45890:8;:31::i;:::-;45113:816;;;;;;;;;;:::o;20614:151::-;20730:18;;;;20703:7;20730:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;20614:151::o;30918:244::-;30195:12;:10;:12::i;:::-;30185:6;;:22;:6;;;:22;;;30177:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31007:22:::1;::::0;::::1;30999:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31109:6;::::0;31088:38:::1;::::0;::::1;::::0;;::::1;::::0;31109:6:::1;::::0;31088:38:::1;::::0;31109:6:::1;::::0;31088:38:::1;31137:6;:17:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;30918:244::o;12180:181::-;12238:7;12270:5;;;12294:6;;;;12286:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12352:1;12180:181;-1:-1:-1;;;12180:181:0:o;8086:106::-;8174:10;8086:106;:::o;26161:346::-;26263:19;;;26255:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26342:21;;;26334:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26415:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;26467:32;;;;;;;;;;;;;;;;;26161:346;;;:::o;23773:539::-;23879:20;;;23871:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23960:23;;;23952:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24036:47;24057:6;24065:9;24076:6;24036:20;:47::i;:::-;24116:71;24138:6;24116:71;;;;;;;;;;;;;;;;;:17;;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;24096:17;;;;:9;:17;;;;;;;;;;;:91;;;;24221:20;;;;;;;:32;;24246:6;24221:24;:32::i;:::-;24198:20;;;;:9;:20;;;;;;;;;;;;:55;;;;24269:35;;;;;;;24198:20;;24269:35;;;;;;;;;;;;;23773:539;;;:::o;13083:192::-;13169:7;13205:12;13197:6;;;;13189:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;13241:5:0;;;13083:192::o;42295:281::-;42348:7;42389:16;42372:13;:11;:13::i;:::-;:33;42368:201;;;-1:-1:-1;42429:24:0;42422:31;;42368:201;42493:64;42515:10;42527:12;42541:15;42493:21;:64::i;:::-;42486:71;;;;24594:378;24678:21;;;24670:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24748:49;24777:1;24781:7;24790:6;24748:20;:49::i;:::-;24825:12;;:24;;24842:6;24825:16;:24::i;:::-;24810:12;:39;24881:18;;;:9;:18;;;;;;;;;;;:30;;24904:6;24881:22;:30::i;:::-;24860:18;;;:9;:18;;;;;;;;;;;:51;;;;24927:37;;;;;;;24860:18;;:9;;24927:37;;;;;;;;;;24594:378;;:::o;25305:418::-;25389:21;;;25381:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25461:49;25482:7;25499:1;25503:6;25461:20;:49::i;:::-;25544:68;25567:6;25544:68;;;;;;;;;;;;;;;;;:18;;;:9;:18;;;;;;;;;;;;:68;:22;:68::i;:::-;25523:18;;;:9;:18;;;;;;;;;;:89;25638:12;;:24;;25655:6;25638:16;:24::i;:::-;25623:12;:39;25678:37;;;;;;;;25704:1;;25678:37;;;;;;;;;;;;;25305:418;;:::o;32292:114::-;32384:14;;32292:114::o;43563:177::-;43632:7;43698:20;:18;:20::i;:::-;43720:10;43669:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43659:73;;;;;;43652:80;;43563:177;;;:::o;37190:1428::-;37275:7;38200:66;38186:80;;;38178:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38322:1;:7;;38327:2;38322:7;:18;;;;38333:1;:7;;38338:2;38333:7;38322:18;38314:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38475:14;38492:24;38502:4;38508:1;38511;38514;38492:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38492:24:0;;;;;;-1:-1:-1;;38535:20:0;;;38527:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38604:6;37190:1428;-1:-1:-1;;;;;37190:1428:0:o;32414:181::-;32568:19;;32586:1;32568:19;;;32414:181::o;43748:192::-;43913:9;;43887:46::o;42584:337::-;42686:7;42766:8;42793:4;42816:7;42842:13;:11;:13::i;:::-;42882:4;42737:165;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42713:200;;;;;;42706:207;;42584:337;;;;;:::o;12644:136::-;12702:7;12729:43;12733:1;12736;12729:43;;;;;;;;;;;;;;;;;:3;:43::i","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa26469706673582212205af8cdcb5a944b722fea73a3a6645a4ac3868374dd93bd61a71b19304a8efe2f64736f6c634300060c0033","offset":6985}},"immutableReferences":{"1158":[{"start":4957,"length":32}],"1160":[{"start":4909,"length":32}],"1162":[{"start":5031,"length":32}],"1164":[{"start":5064,"length":32}],"1166":[{"start":4998,"length":32}],"1320":[{"start":2940,"length":32}]},"transformations":[{"id":"1158","type":"replace","offset":4957,"reason":"immutable"},{"id":"1160","type":"replace","offset":4909,"reason":"immutable"},{"id":"1162","type":"replace","offset":5031,"reason":"immutable"},{"id":"1164","type":"replace","offset":5064,"reason":"immutable"},{"id":"1166","type":"replace","offset":4998,"reason":"immutable"},{"id":"1320","type":"replace","offset":2940,"reason":"immutable"},{"id":"1","type":"replace","offset":6985,"reason":"cborAuxdata"}],"transformationValues":{"immutables":{"1158":"0xa9e572d7c103a339987674ba85d3bf220c2d3b50e12faa30581b80b4cd573427","1160":"0x0000000000000000000000000000000000000000000000000000000000000001","1162":"0x6866a1b3bd19f6f11a36f59b0695f22c22d5c4409a12053c9a747a31d67937bb","1164":"0xc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6","1166":"0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f","1320":"0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9"},"cborAuxdata":{"1":"0xa2646970667358221220fd77525d5811b0476c6aa859e8c0f6389de71d2535d9fc3cd235877d1b83694364736f6c634300060c0033"}}},"proxyResolution":{"isProxy":false,"proxyType":null,"implementations":[]},"deployment":{"transactionHash":"0x9825b9f083ba43112afd66dbcfbbf770e24bc21ff4128ce24ddbda171d79ae2f","blockNumber":"11511393","transactionIndex":"2","deployer":"0x514DF5293Aa7cA53C05D79C37b836596C4ABf687"},"matchId":"1897697","creationMatch":"match","runtimeMatch":"match","verifiedAt":"2024-08-08T14:07:16Z","match":"match","chainId":"1","address":"0x111111111117dC0aa78b770fA6A738034120C302"}