{"sources":{"GraphToken.sol":{"content":"// Sources flattened with hardhat v2.0.2 https://hardhat.org\r\n\r\n// File @openzeppelin/contracts/GSN/Context.sol@v3.3.0-solc-0.7\r\n\r\n// SPDX-License-Identifier: MIT\r\n\r\npragma solidity ^0.7.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\r\n// File @openzeppelin/contracts/token/ERC20/IERC20.sol@v3.3.0-solc-0.7\r\n\r\npragma solidity ^0.7.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\r\n// File @openzeppelin/contracts/math/SafeMath.sol@v3.3.0-solc-0.7\r\n\r\npragma solidity ^0.7.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\r\n// File @openzeppelin/contracts/token/ERC20/ERC20.sol@v3.3.0-solc-0.7\r\n\r\npragma solidity ^0.7.0;\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_) {\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\r\n// File @openzeppelin/contracts/token/ERC20/ERC20Burnable.sol@v3.3.0-solc-0.7\r\n\r\npragma solidity ^0.7.0;\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\r\n// File @openzeppelin/contracts/cryptography/ECDSA.sol@v3.3.0-solc-0.7\r\n\r\npragma solidity ^0.7.0;\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        // 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\r\n// File contracts/governance/Governed.sol\r\n\r\npragma solidity ^0.7.3;\r\n\r\n/**\r\n * @title Graph Governance contract\r\n * @dev All contracts that will be owned by a Governor entity should extend this contract.\r\n */\r\ncontract Governed {\r\n    // -- State --\r\n\r\n    address public governor;\r\n    address public pendingGovernor;\r\n\r\n    // -- Events --\r\n\r\n    event NewPendingOwnership(address indexed from, address indexed to);\r\n    event NewOwnership(address indexed from, address indexed to);\r\n\r\n    /**\r\n     * @dev Check if the caller is the governor.\r\n     */\r\n    modifier onlyGovernor {\r\n        require(msg.sender == governor, \"Only Governor can call\");\r\n        _;\r\n    }\r\n\r\n    /**\r\n     * @dev Initialize the governor to the contract caller.\r\n     */\r\n    function _initialize(address _initGovernor) internal {\r\n        governor = _initGovernor;\r\n    }\r\n\r\n    /**\r\n     * @dev Admin function to begin change of governor. The `_newGovernor` must call\r\n     * `acceptOwnership` to finalize the transfer.\r\n     * @param _newGovernor Address of new `governor`\r\n     */\r\n    function transferOwnership(address _newGovernor) external onlyGovernor {\r\n        require(_newGovernor != address(0), \"Governor must be set\");\r\n\r\n        address oldPendingGovernor = pendingGovernor;\r\n        pendingGovernor = _newGovernor;\r\n\r\n        emit NewPendingOwnership(oldPendingGovernor, pendingGovernor);\r\n    }\r\n\r\n    /**\r\n     * @dev Admin function for pending governor to accept role and update governor.\r\n     * This function must called by the pending governor.\r\n     */\r\n    function acceptOwnership() external {\r\n        require(\r\n            pendingGovernor != address(0) && msg.sender == pendingGovernor,\r\n            \"Caller must be pending governor\"\r\n        );\r\n\r\n        address oldGovernor = governor;\r\n        address oldPendingGovernor = pendingGovernor;\r\n\r\n        governor = pendingGovernor;\r\n        pendingGovernor = address(0);\r\n\r\n        emit NewOwnership(oldGovernor, governor);\r\n        emit NewPendingOwnership(oldPendingGovernor, pendingGovernor);\r\n    }\r\n}\r\n\r\n\r\n// File contracts/token/GraphToken.sol\r\n\r\npragma solidity ^0.7.3;\r\n\r\n\r\n\r\n\r\n/**\r\n * @title GraphToken contract\r\n * @dev This is the implementation of the ERC20 Graph Token.\r\n * The implementation exposes a Permit() function to allow for a spender to send a signed message\r\n * and approve funds to a spender following EIP2612 to make integration with other contracts easier.\r\n *\r\n * The token is initially owned by the deployer address that can mint tokens to create the initial\r\n * distribution. For convenience, an initial supply can be passed in the constructor that will be\r\n * assigned to the deployer.\r\n *\r\n * The governor can add the RewardsManager contract to mint indexing rewards.\r\n *\r\n */\r\ncontract GraphToken is Governed, ERC20, ERC20Burnable {\r\n    using SafeMath for uint256;\r\n\r\n    // -- EIP712 --\r\n    // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md#definition-of-domainseparator\r\n\r\n    bytes32 private constant DOMAIN_TYPE_HASH = keccak256(\r\n        \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract,bytes32 salt)\"\r\n    );\r\n    bytes32 private constant DOMAIN_NAME_HASH = keccak256(\"Graph Token\");\r\n    bytes32 private constant DOMAIN_VERSION_HASH = keccak256(\"0\");\r\n    bytes32\r\n        private constant DOMAIN_SALT = 0x51f3d585afe6dfeb2af01bba0889a36c1db03beec88c6a4d0c53817069026afa; // Randomly generated salt\r\n    bytes32 private constant PERMIT_TYPEHASH = keccak256(\r\n        \"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\"\r\n    );\r\n\r\n    // -- State --\r\n\r\n    bytes32 private DOMAIN_SEPARATOR;\r\n    mapping(address => bool) private _minters;\r\n    mapping(address => uint256) public nonces;\r\n\r\n    // -- Events --\r\n\r\n    event MinterAdded(address indexed account);\r\n    event MinterRemoved(address indexed account);\r\n\r\n    modifier onlyMinter() {\r\n        require(isMinter(msg.sender), \"Only minter can call\");\r\n        _;\r\n    }\r\n\r\n    /**\r\n     * @dev Graph Token Contract Constructor.\r\n     * @param _initialSupply Initial supply of GRT\r\n     */\r\n    constructor(uint256 _initialSupply) ERC20(\"Graph Token\", \"GRT\") {\r\n        Governed._initialize(msg.sender);\r\n\r\n        // The Governor has the initial supply of tokens\r\n        _mint(msg.sender, _initialSupply);\r\n\r\n        // The Governor is the default minter\r\n        _addMinter(msg.sender);\r\n\r\n        // EIP-712 domain separator\r\n        DOMAIN_SEPARATOR = keccak256(\r\n            abi.encode(\r\n                DOMAIN_TYPE_HASH,\r\n                DOMAIN_NAME_HASH,\r\n                DOMAIN_VERSION_HASH,\r\n                _getChainID(),\r\n                address(this),\r\n                DOMAIN_SALT\r\n            )\r\n        );\r\n    }\r\n\r\n    /**\r\n     * @dev Approve token allowance by validating a message signed by the holder.\r\n     * @param _owner Address of the token holder\r\n     * @param _spender Address of the approved spender\r\n     * @param _value Amount of tokens to approve the spender\r\n     * @param _deadline Expiration time of the signed permit\r\n     * @param _v Signature version\r\n     * @param _r Signature r value\r\n     * @param _s Signature s value\r\n     */\r\n    function permit(\r\n        address _owner,\r\n        address _spender,\r\n        uint256 _value,\r\n        uint256 _deadline,\r\n        uint8 _v,\r\n        bytes32 _r,\r\n        bytes32 _s\r\n    ) external {\r\n        bytes32 digest = keccak256(\r\n            abi.encodePacked(\r\n                \"\\x19\\x01\",\r\n                DOMAIN_SEPARATOR,\r\n                keccak256(\r\n                    abi.encode(\r\n                        PERMIT_TYPEHASH,\r\n                        _owner,\r\n                        _spender,\r\n                        _value,\r\n                        nonces[_owner],\r\n                        _deadline\r\n                    )\r\n                )\r\n            )\r\n        );\r\n        nonces[_owner] = nonces[_owner].add(1);\r\n\r\n        address recoveredAddress = ECDSA.recover(digest, abi.encodePacked(_r, _s, _v));\r\n        require(_owner == recoveredAddress, \"GRT: invalid permit\");\r\n        require(_deadline == 0 || block.timestamp <= _deadline, \"GRT: expired permit\");\r\n\r\n        _approve(_owner, _spender, _value);\r\n    }\r\n\r\n    /**\r\n     * @dev Add a new minter.\r\n     * @param _account Address of the minter\r\n     */\r\n    function addMinter(address _account) external onlyGovernor {\r\n        _addMinter(_account);\r\n    }\r\n\r\n    /**\r\n     * @dev Remove a minter.\r\n     * @param _account Address of the minter\r\n     */\r\n    function removeMinter(address _account) external onlyGovernor {\r\n        _removeMinter(_account);\r\n    }\r\n\r\n    /**\r\n     * @dev Renounce to be a minter.\r\n     */\r\n    function renounceMinter() external {\r\n        _removeMinter(msg.sender);\r\n    }\r\n\r\n    /**\r\n     * @dev Mint new tokens.\r\n     * @param _to Address to send the newly minted tokens\r\n     * @param _amount Amount of tokens to mint\r\n     */\r\n    function mint(address _to, uint256 _amount) external onlyMinter {\r\n        _mint(_to, _amount);\r\n    }\r\n\r\n    /**\r\n     * @dev Return if the `_account` is a minter or not.\r\n     * @param _account Address to check\r\n     * @return True if the `_account` is minter\r\n     */\r\n    function isMinter(address _account) public view returns (bool) {\r\n        return _minters[_account];\r\n    }\r\n\r\n    /**\r\n     * @dev Add a new minter.\r\n     * @param _account Address of the minter\r\n     */\r\n    function _addMinter(address _account) private {\r\n        _minters[_account] = true;\r\n        emit MinterAdded(_account);\r\n    }\r\n\r\n    /**\r\n     * @dev Remove a minter.\r\n     * @param _account Address of the minter\r\n     */\r\n    function _removeMinter(address _account) private {\r\n        _minters[_account] = false;\r\n        emit MinterRemoved(_account);\r\n    }\r\n\r\n    /**\r\n     * @dev Get the running network chain ID.\r\n     * @return The chain ID\r\n     */\r\n    function _getChainID() private pure returns (uint256) {\r\n        uint256 id;\r\n        assembly {\r\n            id := chainid()\r\n        }\r\n        return id;\r\n    }\r\n}"}},"compilation":{"language":"Solidity","compiler":"solc","compilerVersion":"0.7.4+commit.3f05b770","compilerSettings":{"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"optimizer":{"runs":200,"enabled":true},"evmVersion":"istanbul","remappings":[]},"name":"GraphToken","fullyQualifiedName":"GraphToken.sol:GraphToken"},"runtimeBytecode":{"onchainBytecode":"0x608060405234801561001057600080fd5b50600436106101585760003560e01c806379cc6790116100c3578063a9059cbb1161007c578063a9059cbb1461042b578063aa271e1a14610457578063d505accf1461047d578063dd62ed3e146104ce578063e3056a34146104fc578063f2fde38b1461050457610158565b806379cc6790146103775780637ecebe00146103a357806395d89b41146103c9578063983b2d56146103d157806398650275146103f7578063a457c2d7146103ff57610158565b8063313ce56711610115578063313ce567146102b657806339509351146102d457806340c10f191461030057806342966c681461032c57806370a082311461034957806379ba50971461036f57610158565b806306fdde031461015d578063095ea7b3146101da5780630c340a241461021a57806318160ddd1461023e57806323b872dd146102585780633092afd51461028e575b600080fd5b61016561052a565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561019f578181015183820152602001610187565b50505050905090810190601f1680156101cc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610206600480360360408110156101f057600080fd5b506001600160a01b0381351690602001356105c0565b604080519115158252519081900360200190f35b6102226105dd565b604080516001600160a01b039092168252519081900360200190f35b6102466105ec565b60408051918252519081900360200190f35b6102066004803603606081101561026e57600080fd5b506001600160a01b038135811691602081013590911690604001356105f2565b6102b4600480360360208110156102a457600080fd5b50356001600160a01b0316610679565b005b6102be6106dd565b6040805160ff9092168252519081900360200190f35b610206600480360360408110156102ea57600080fd5b506001600160a01b0381351690602001356106e6565b6102b46004803603604081101561031657600080fd5b506001600160a01b038135169060200135610734565b6102b46004803603602081101561034257600080fd5b5035610793565b6102466004803603602081101561035f57600080fd5b50356001600160a01b03166107a4565b6102b46107bf565b6102b46004803603604081101561038d57600080fd5b506001600160a01b0381351690602001356108ce565b610246600480360360208110156103b957600080fd5b50356001600160a01b0316610928565b61016561093a565b6102b4600480360360208110156103e757600080fd5b50356001600160a01b031661099b565b6102b46109fc565b6102066004803603604081101561041557600080fd5b506001600160a01b038135169060200135610a07565b6102066004803603604081101561044157600080fd5b506001600160a01b038135169060200135610a6f565b6102066004803603602081101561046d57600080fd5b50356001600160a01b0316610a83565b6102b4600480360360e081101561049357600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135610aa1565b610246600480360360408110156104e457600080fd5b506001600160a01b0381358116916020013516610c95565b610222610cc0565b6102b46004803603602081101561051a57600080fd5b50356001600160a01b0316610ccf565b60058054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105b65780601f1061058b576101008083540402835291602001916105b6565b820191906000526020600020905b81548152906001019060200180831161059957829003601f168201915b5050505050905090565b60006105d46105cd610e50565b8484610e54565b50600192915050565b6000546001600160a01b031681565b60045490565b60006105ff848484610f40565b61066f8461060b610e50565b61066a856040518060600160405280602881526020016116b2602891396001600160a01b038a16600090815260036020526040812090610649610e50565b6001600160a01b03168152602081019190915260400160002054919061109d565b610e54565b5060019392505050565b6000546001600160a01b031633146106d1576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6106da81611134565b50565b60075460ff1690565b60006105d46106f3610e50565b8461066a8560036000610704610e50565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490610def565b61073d33610a83565b610785576040805162461bcd60e51b815260206004820152601460248201527313db9b1e481b5a5b9d195c8818d85b8818d85b1b60621b604482015290519081900360640190fd5b61078f828261117d565b5050565b6106da61079e610e50565b8261126f565b6001600160a01b031660009081526002602052604090205490565b6001546001600160a01b0316158015906107e357506001546001600160a01b031633145b610834576040805162461bcd60e51b815260206004820152601f60248201527f43616c6c6572206d7573742062652070656e64696e6720676f7665726e6f7200604482015290519081900360640190fd5b60008054600180546001600160a01b038082166001600160a01b03198086168217808855931690935560405193811694929391169184917f0ac6deed30eef60090c749850e10f2fa469e3e25fec1d1bef2853003f6e6f18f9190a36001546040516001600160a01b03918216918316907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b6000610905826040518060600160405280602481526020016116da602491396108fe866108f9610e50565b610c95565b919061109d565b905061091983610913610e50565b83610e54565b610923838361126f565b505050565b600a6020526000908152604090205481565b60068054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105b65780601f1061058b576101008083540402835291602001916105b6565b6000546001600160a01b031633146109f3576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6106da8161136b565b610a0533611134565b565b60006105d4610a14610e50565b8461066a856040518060600160405280602581526020016117686025913960036000610a3e610e50565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919061109d565b60006105d4610a7c610e50565b8484610f40565b6001600160a01b031660009081526009602052604090205460ff1690565b6008546001600160a01b038089166000818152600a602081815260408084205481517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981850152808301879052968e166060880152608087018d905260a0870181905260c08088018d90528251808903909101815260e08801835280519084012061190160f01b6101008901526101028801989098526101228088019890985281518088039098018852610142909601905285519581019590952092909152909252610b6e906001610def565b6001600160a01b0389166000908152600a602090815260408083209390935582519081018690528083018590526001600160f81b031960f888901b16606082015282516041818303018152606190910190925290610bcd9083906113b7565b9050806001600160a01b0316896001600160a01b031614610c2b576040805162461bcd60e51b815260206004820152601360248201527211d4950e881a5b9d985b1a59081c195c9b5a5d606a1b604482015290519081900360640190fd5b851580610c385750854211155b610c7f576040805162461bcd60e51b815260206004820152601360248201527211d4950e88195e1c1a5c9959081c195c9b5a5d606a1b604482015290519081900360640190fd5b610c8a898989610e54565b505050505050505050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b6001546001600160a01b031681565b6000546001600160a01b03163314610d27576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b038116610d79576040805162461bcd60e51b815260206004820152601460248201527311dbdd995c9b9bdc881b5d5cdd081899481cd95d60621b604482015290519081900360640190fd5b600180546001600160a01b038381166001600160a01b03198316179283905560405191811692169082907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b600082820183811015610e49576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b3390565b6001600160a01b038316610e995760405162461bcd60e51b81526004018080602001828103825260248152602001806117446024913960400191505060405180910390fd5b6001600160a01b038216610ede5760405162461bcd60e51b81526004018080602001828103825260228152602001806116266022913960400191505060405180910390fd5b6001600160a01b03808416600081815260036020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316610f855760405162461bcd60e51b815260040180806020018281038252602581526020018061171f6025913960400191505060405180910390fd5b6001600160a01b038216610fca5760405162461bcd60e51b81526004018080602001828103825260238152602001806115e16023913960400191505060405180910390fd5b610fd5838383610923565b61101281604051806060016040528060268152602001611648602691396001600160a01b038616600090815260026020526040902054919061109d565b6001600160a01b0380851660009081526002602052604080822093909355908416815220546110419082610def565b6001600160a01b0380841660008181526002602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000818484111561112c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156110f15781810151838201526020016110d9565b50505050905090810190601f16801561111e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b038116600081815260096020526040808220805460ff19169055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a250565b6001600160a01b0382166111d8576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6111e460008383610923565b6004546111f19082610def565b6004556001600160a01b0382166000908152600260205260409020546112179082610def565b6001600160a01b03831660008181526002602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b0382166112b45760405162461bcd60e51b81526004018080602001828103825260218152602001806116fe6021913960400191505060405180910390fd5b6112c082600083610923565b6112fd81604051806060016040528060228152602001611604602291396001600160a01b038516600090815260026020526040902054919061109d565b6001600160a01b038316600090815260026020526040902055600454611323908261159e565b6004556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b038116600081815260096020526040808220805460ff19166001179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b6000815160411461140f576040805162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015290519081900360640190fd5b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156114805760405162461bcd60e51b815260040180806020018281038252602281526020018061166e6022913960400191505060405180910390fd5b8060ff16601b148061149557508060ff16601c145b6114d05760405162461bcd60e51b81526004018080602001828103825260228152602001806116906022913960400191505060405180910390fd5b600060018783868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561152c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611594576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b9695505050505050565b6000610e4983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061109d56fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545434453413a20696e76616c6964207369676e6174757265202773272076616c756545434453413a20696e76616c6964207369676e6174757265202776272076616c756545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122028978c229b51c3a9489101e8096301e85866fa63b6ccbd95d247e376d1f5407664736f6c63430007040033","recompiledBytecode":"0x608060405234801561001057600080fd5b50600436106101585760003560e01c806379cc6790116100c3578063a9059cbb1161007c578063a9059cbb1461042b578063aa271e1a14610457578063d505accf1461047d578063dd62ed3e146104ce578063e3056a34146104fc578063f2fde38b1461050457610158565b806379cc6790146103775780637ecebe00146103a357806395d89b41146103c9578063983b2d56146103d157806398650275146103f7578063a457c2d7146103ff57610158565b8063313ce56711610115578063313ce567146102b657806339509351146102d457806340c10f191461030057806342966c681461032c57806370a082311461034957806379ba50971461036f57610158565b806306fdde031461015d578063095ea7b3146101da5780630c340a241461021a57806318160ddd1461023e57806323b872dd146102585780633092afd51461028e575b600080fd5b61016561052a565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561019f578181015183820152602001610187565b50505050905090810190601f1680156101cc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610206600480360360408110156101f057600080fd5b506001600160a01b0381351690602001356105c0565b604080519115158252519081900360200190f35b6102226105dd565b604080516001600160a01b039092168252519081900360200190f35b6102466105ec565b60408051918252519081900360200190f35b6102066004803603606081101561026e57600080fd5b506001600160a01b038135811691602081013590911690604001356105f2565b6102b4600480360360208110156102a457600080fd5b50356001600160a01b0316610679565b005b6102be6106dd565b6040805160ff9092168252519081900360200190f35b610206600480360360408110156102ea57600080fd5b506001600160a01b0381351690602001356106e6565b6102b46004803603604081101561031657600080fd5b506001600160a01b038135169060200135610734565b6102b46004803603602081101561034257600080fd5b5035610793565b6102466004803603602081101561035f57600080fd5b50356001600160a01b03166107a4565b6102b46107bf565b6102b46004803603604081101561038d57600080fd5b506001600160a01b0381351690602001356108ce565b610246600480360360208110156103b957600080fd5b50356001600160a01b0316610928565b61016561093a565b6102b4600480360360208110156103e757600080fd5b50356001600160a01b031661099b565b6102b46109fc565b6102066004803603604081101561041557600080fd5b506001600160a01b038135169060200135610a07565b6102066004803603604081101561044157600080fd5b506001600160a01b038135169060200135610a6f565b6102066004803603602081101561046d57600080fd5b50356001600160a01b0316610a83565b6102b4600480360360e081101561049357600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135610aa1565b610246600480360360408110156104e457600080fd5b506001600160a01b0381358116916020013516610c95565b610222610cc0565b6102b46004803603602081101561051a57600080fd5b50356001600160a01b0316610ccf565b60058054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105b65780601f1061058b576101008083540402835291602001916105b6565b820191906000526020600020905b81548152906001019060200180831161059957829003601f168201915b5050505050905090565b60006105d46105cd610e50565b8484610e54565b50600192915050565b6000546001600160a01b031681565b60045490565b60006105ff848484610f40565b61066f8461060b610e50565b61066a856040518060600160405280602881526020016116b2602891396001600160a01b038a16600090815260036020526040812090610649610e50565b6001600160a01b03168152602081019190915260400160002054919061109d565b610e54565b5060019392505050565b6000546001600160a01b031633146106d1576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6106da81611134565b50565b60075460ff1690565b60006105d46106f3610e50565b8461066a8560036000610704610e50565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490610def565b61073d33610a83565b610785576040805162461bcd60e51b815260206004820152601460248201527313db9b1e481b5a5b9d195c8818d85b8818d85b1b60621b604482015290519081900360640190fd5b61078f828261117d565b5050565b6106da61079e610e50565b8261126f565b6001600160a01b031660009081526002602052604090205490565b6001546001600160a01b0316158015906107e357506001546001600160a01b031633145b610834576040805162461bcd60e51b815260206004820152601f60248201527f43616c6c6572206d7573742062652070656e64696e6720676f7665726e6f7200604482015290519081900360640190fd5b60008054600180546001600160a01b038082166001600160a01b03198086168217808855931690935560405193811694929391169184917f0ac6deed30eef60090c749850e10f2fa469e3e25fec1d1bef2853003f6e6f18f9190a36001546040516001600160a01b03918216918316907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b6000610905826040518060600160405280602481526020016116da602491396108fe866108f9610e50565b610c95565b919061109d565b905061091983610913610e50565b83610e54565b610923838361126f565b505050565b600a6020526000908152604090205481565b60068054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105b65780601f1061058b576101008083540402835291602001916105b6565b6000546001600160a01b031633146109f3576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6106da8161136b565b610a0533611134565b565b60006105d4610a14610e50565b8461066a856040518060600160405280602581526020016117686025913960036000610a3e610e50565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919061109d565b60006105d4610a7c610e50565b8484610f40565b6001600160a01b031660009081526009602052604090205460ff1690565b6008546001600160a01b038089166000818152600a602081815260408084205481517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981850152808301879052968e166060880152608087018d905260a0870181905260c08088018d90528251808903909101815260e08801835280519084012061190160f01b6101008901526101028801989098526101228088019890985281518088039098018852610142909601905285519581019590952092909152909252610b6e906001610def565b6001600160a01b0389166000908152600a602090815260408083209390935582519081018690528083018590526001600160f81b031960f888901b16606082015282516041818303018152606190910190925290610bcd9083906113b7565b9050806001600160a01b0316896001600160a01b031614610c2b576040805162461bcd60e51b815260206004820152601360248201527211d4950e881a5b9d985b1a59081c195c9b5a5d606a1b604482015290519081900360640190fd5b851580610c385750854211155b610c7f576040805162461bcd60e51b815260206004820152601360248201527211d4950e88195e1c1a5c9959081c195c9b5a5d606a1b604482015290519081900360640190fd5b610c8a898989610e54565b505050505050505050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b6001546001600160a01b031681565b6000546001600160a01b03163314610d27576040805162461bcd60e51b815260206004820152601660248201527513db9b1e4811dbdd995c9b9bdc8818d85b8818d85b1b60521b604482015290519081900360640190fd5b6001600160a01b038116610d79576040805162461bcd60e51b815260206004820152601460248201527311dbdd995c9b9bdc881b5d5cdd081899481cd95d60621b604482015290519081900360640190fd5b600180546001600160a01b038381166001600160a01b03198316179283905560405191811692169082907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b600082820183811015610e49576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b3390565b6001600160a01b038316610e995760405162461bcd60e51b81526004018080602001828103825260248152602001806117446024913960400191505060405180910390fd5b6001600160a01b038216610ede5760405162461bcd60e51b81526004018080602001828103825260228152602001806116266022913960400191505060405180910390fd5b6001600160a01b03808416600081815260036020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316610f855760405162461bcd60e51b815260040180806020018281038252602581526020018061171f6025913960400191505060405180910390fd5b6001600160a01b038216610fca5760405162461bcd60e51b81526004018080602001828103825260238152602001806115e16023913960400191505060405180910390fd5b610fd5838383610923565b61101281604051806060016040528060268152602001611648602691396001600160a01b038616600090815260026020526040902054919061109d565b6001600160a01b0380851660009081526002602052604080822093909355908416815220546110419082610def565b6001600160a01b0380841660008181526002602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000818484111561112c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156110f15781810151838201526020016110d9565b50505050905090810190601f16801561111e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b038116600081815260096020526040808220805460ff19169055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a250565b6001600160a01b0382166111d8576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6111e460008383610923565b6004546111f19082610def565b6004556001600160a01b0382166000908152600260205260409020546112179082610def565b6001600160a01b03831660008181526002602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b0382166112b45760405162461bcd60e51b81526004018080602001828103825260218152602001806116fe6021913960400191505060405180910390fd5b6112c082600083610923565b6112fd81604051806060016040528060228152602001611604602291396001600160a01b038516600090815260026020526040902054919061109d565b6001600160a01b038316600090815260026020526040902055600454611323908261159e565b6004556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b038116600081815260096020526040808220805460ff19166001179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b6000815160411461140f576040805162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015290519081900360640190fd5b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156114805760405162461bcd60e51b815260040180806020018281038252602281526020018061166e6022913960400191505060405180910390fd5b8060ff16601b148061149557508060ff16601c145b6114d05760405162461bcd60e51b81526004018080602001828103825260228152602001806116906022913960400191505060405180910390fd5b600060018783868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561152c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611594576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b9695505050505050565b6000610e4983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061109d56fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545434453413a20696e76616c6964207369676e6174757265202773272076616c756545434453413a20696e76616c6964207369676e6174757265202776272076616c756545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220fc6a610537cb2ba86624b82ac9841ac7965591f5e04803d39830cb8c654ef49f64736f6c63430007040033","sourceMap":"28034:5302:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11468:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13574:169;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13574:169:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;25522:23;;;:::i;:::-;;;;-1:-1:-1;;;;;25522:23:0;;;;;;;;;;;;;;12543:100;;;:::i;:::-;;;;;;;;;;;;;;;;14225:321;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14225:321:0;;;;;;;;;;;;;;;;;:::i;31810:104::-;;;;;;;;;;;;;;;;-1:-1:-1;31810:104:0;-1:-1:-1;;;;;31810:104:0;;:::i;:::-;;12395:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14955:218;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14955:218:0;;;;;;;;:::i;32220:102::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32220:102:0;;;;;;;;:::i;20819:91::-;;;;;;;;;;;;;;;;-1:-1:-1;20819:91:0;;:::i;12706:119::-;;;;;;;;;;;;;;;;-1:-1:-1;12706:119:0;-1:-1:-1;;;;;12706:119:0;;:::i;26827:499::-;;;:::i;21229:295::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21229:295:0;;;;;;;;:::i;28990:41::-;;;;;;;;;;;;;;;;-1:-1:-1;28990:41:0;-1:-1:-1;;;;;28990:41:0;;:::i;11670:87::-;;;:::i;31610:98::-;;;;;;;;;;;;;;;;-1:-1:-1;31610:98:0;-1:-1:-1;;;;;31610:98:0;;:::i;31978:79::-;;;:::i;15676:269::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15676:269:0;;;;;;;;:::i;13038:175::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13038:175:0;;;;;;;;:::i;32496:107::-;;;;;;;;;;;;;;;;-1:-1:-1;32496:107:0;-1:-1:-1;;;;;32496:107:0;;:::i;30475:1032::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30475:1032:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;13276:151::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13276:151:0;;;;;;;;;;:::i;25552:30::-;;;:::i;26336:321::-;;;;;;;;;;;;;;;;-1:-1:-1;26336:321:0;-1:-1:-1;;;;;26336:321:0;;:::i;11468:83::-;11538:5;11531:12;;;;;;;;-1:-1:-1;;11531:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11505:13;;11531:12;;11538:5;;11531:12;;11538:5;11531:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11468:83;:::o;13574:169::-;13657:4;13674:39;13683:12;:10;:12::i;:::-;13697:7;13706:6;13674:8;:39::i;:::-;-1:-1:-1;13731:4:0;13574:169;;;;:::o;25522:23::-;;;-1:-1:-1;;;;;25522:23:0;;:::o;12543:100::-;12623:12;;12543:100;:::o;14225:321::-;14331:4;14348:36;14358:6;14366:9;14377:6;14348:9;:36::i;:::-;14395:121;14404:6;14412:12;:10;:12::i;:::-;14426:89;14464:6;14426:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14426:19:0;;;;;;:11;:19;;;;;;14446:12;:10;:12::i;:::-;-1:-1:-1;;;;;14426:33:0;;;;;;;;;;;;-1:-1:-1;14426:33:0;;;:89;:37;:89::i;:::-;14395:8;:121::i;:::-;-1:-1:-1;14534:4:0;14225:321;;;;;:::o;31810:104::-;25880:8;;-1:-1:-1;;;;;25880:8:0;25866:10;:22;25858:57;;;;;-1:-1:-1;;;25858:57:0;;;;;;;;;;;;-1:-1:-1;;;25858:57:0;;;;;;;;;;;;;;;31883:23:::1;31897:8;31883:13;:23::i;:::-;31810:104:::0;:::o;12395:83::-;12461:9;;;;12395:83;:::o;14955:218::-;15043:4;15060:83;15069:12;:10;:12::i;:::-;15083:7;15092:50;15131:10;15092:11;:25;15104:12;:10;:12::i;:::-;-1:-1:-1;;;;;15092:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;15092:25:0;;;:34;;;;;;;;;;;:38;:50::i;32220:102::-;29206:20;29215:10;29206:8;:20::i;:::-;29198:53;;;;;-1:-1:-1;;;29198:53:0;;;;;;;;;;;;-1:-1:-1;;;29198:53:0;;;;;;;;;;;;;;;32295:19:::1;32301:3;32306:7;32295:5;:19::i;:::-;32220:102:::0;;:::o;20819:91::-;20875:27;20881:12;:10;:12::i;:::-;20895:6;20875:5;:27::i;12706:119::-;-1:-1:-1;;;;;12799:18:0;12772:7;12799:18;;;:9;:18;;;;;;;12706:119::o;26827:499::-;26896:15;;-1:-1:-1;;;;;26896:15:0;:29;;;;:62;;-1:-1:-1;26943:15:0;;-1:-1:-1;;;;;26943:15:0;26929:10;:29;26896:62;26874:143;;;;;-1:-1:-1;;;26874:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27030:19;27052:8;;;27100:15;;-1:-1:-1;;;;;27100:15:0;;;-1:-1:-1;;;;;;27128:26:0;;;;;;;;27165:28;;;;;27211:35;;27052:8;;;;27100:15;;27237:8;;;27052;;27211:35;;27030:19;27211:35;27302:15;;27262:56;;-1:-1:-1;;;;;27302:15:0;;;;27262:56;;;;;27302:15;;27262:56;26827:499;;:::o;21229:295::-;21306:26;21335:84;21372:6;21335:84;;;;;;;;;;;;;;;;;:32;21345:7;21354:12;:10;:12::i;:::-;21335:9;:32::i;:::-;:36;:84;:36;:84::i;:::-;21306:113;;21432:51;21441:7;21450:12;:10;:12::i;:::-;21464:18;21432:8;:51::i;:::-;21494:22;21500:7;21509:6;21494:5;:22::i;:::-;21229:295;;;:::o;28990:41::-;;;;;;;;;;;;;:::o;11670:87::-;11742:7;11735:14;;;;;;;;-1:-1:-1;;11735:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11709:13;;11735:14;;11742:7;;11735:14;;11742:7;11735:14;;;;;;;;;;;;;;;;;;;;;;;;31610:98;25880:8;;-1:-1:-1;;;;;25880:8:0;25866:10;:22;25858:57;;;;;-1:-1:-1;;;25858:57:0;;;;;;;;;;;;-1:-1:-1;;;25858:57:0;;;;;;;;;;;;;;;31680:20:::1;31691:8;31680:10;:20::i;31978:79::-:0;32024:25;32038:10;32024:13;:25::i;:::-;31978:79::o;15676:269::-;15769:4;15786:129;15795:12;:10;:12::i;:::-;15809:7;15818:96;15857:15;15818:96;;;;;;;;;;;;;;;;;:11;:25;15830:12;:10;:12::i;:::-;-1:-1:-1;;;;;15818:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;15818:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;13038:175::-;13124:4;13141:42;13151:12;:10;:12::i;:::-;13165:9;13176:6;13141:9;:42::i;32496:107::-;-1:-1:-1;;;;;32577:18:0;32553:4;32577:18;;;:8;:18;;;;;;;;;32496:107::o;30475:1032::-;30789:16;;-1:-1:-1;;;;;31036:14:0;;;30684;31036;;;:6;:14;;;;;;;;;30856:253;;28761:111;30856:253;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30824:304;;;;;;-1:-1:-1;;;30725:418:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30701:453;;;;;;;;;31182:14;;;;;;;:21;;31201:1;31182:18;:21::i;:::-;-1:-1:-1;;;;;31165:14:0;;;;;;:6;:14;;;;;;;;:38;;;;31265:28;;;;;;;;;;;;;;-1:-1:-1;;;;;;31265:28:0;;;;;;;;;;;;;;;;;;;;;;;;;31165:14;31243:51;;31257:6;;31243:13;:51::i;:::-;31216:78;;31323:16;-1:-1:-1;;;;;31313:26:0;:6;-1:-1:-1;;;;;31313:26:0;;31305:58;;;;;-1:-1:-1;;;31305:58:0;;;;;;;;;;;;-1:-1:-1;;;31305:58:0;;;;;;;;;;;;;;;31382:14;;;:46;;;31419:9;31400:15;:28;;31382:46;31374:78;;;;;-1:-1:-1;;;31374:78:0;;;;;;;;;;;;-1:-1:-1;;;31374:78:0;;;;;;;;;;;;;;;31465:34;31474:6;31482:8;31492:6;31465:8;:34::i;:::-;30475:1032;;;;;;;;;:::o;13276:151::-;-1:-1:-1;;;;;13392:18:0;;;13365:7;13392:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;13276:151::o;25552:30::-;;;-1:-1:-1;;;;;25552:30:0;;:::o;26336:321::-;25880:8;;-1:-1:-1;;;;;25880:8:0;25866:10;:22;25858:57;;;;;-1:-1:-1;;;25858:57:0;;;;;;;;;;;;-1:-1:-1;;;25858:57:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;26426:26:0;::::1;26418:59;;;::::0;;-1:-1:-1;;;26418:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26418:59:0;;;;;;;;;;;;;::::1;;26519:15;::::0;;-1:-1:-1;;;;;26545:30:0;;::::1;-1:-1:-1::0;;;;;;26545:30:0;::::1;;::::0;;;;26593:56:::1;::::0;26519:15;;::::1;::::0;26633::::1;::::0;26519;;26593:56:::1;::::0;26490:26:::1;::::0;26593:56:::1;25926:1;26336:321:::0;:::o;26022:96::-;26086:8;:24;;-1:-1:-1;;;;;;26086:24:0;-1:-1:-1;;;;;26086:24:0;;;;;;;;;;26022:96::o;4844:181::-;4902:7;4934:5;;;4958:6;;;;4950:46;;;;;-1:-1:-1;;;4950:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5016:1;4844:181;-1:-1:-1;;;4844:181:0:o;736:106::-;824:10;736:106;:::o;18823:346::-;-1:-1:-1;;;;;18925:19:0;;18917:68;;;;-1:-1:-1;;;18917:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19004:21:0;;18996:68;;;;-1:-1:-1;;;18996:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19077:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;19129:32;;;;;;;;;;;;;;;;;18823:346;;;:::o;16435:539::-;-1:-1:-1;;;;;16541:20:0;;16533:70;;;;-1:-1:-1;;;16533:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16622:23:0;;16614:71;;;;-1:-1:-1;;;16614:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16698:47;16719:6;16727:9;16738:6;16698:20;:47::i;:::-;16778:71;16800:6;16778:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16778:17:0;;;;;;:9;:17;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;16758:17:0;;;;;;;:9;:17;;;;;;:91;;;;16883:20;;;;;;;:32;;16908:6;16883:24;:32::i;:::-;-1:-1:-1;;;;;16860:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;16931:35;;;;;;;16860:20;;16931:35;;;;;;;;;;;;;16435:539;;;:::o;5747:192::-;5833:7;5869:12;5861:6;;;;5853:29;;;;-1:-1:-1;;;5853:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5905:5:0;;;5747:192::o;32935:133::-;-1:-1:-1;;;;;32995:18:0;;33016:5;32995:18;;;:8;:18;;;;;;:26;;-1:-1:-1;;32995:26:0;;;33037:23;;;33016:5;33037:23;32935:133;:::o;17256:378::-;-1:-1:-1;;;;;17340:21:0;;17332:65;;;;;-1:-1:-1;;;17332:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17410:49;17439:1;17443:7;17452:6;17410:20;:49::i;:::-;17487:12;;:24;;17504:6;17487:16;:24::i;:::-;17472:12;:39;-1:-1:-1;;;;;17543:18:0;;;;;;:9;:18;;;;;;:30;;17566:6;17543:22;:30::i;:::-;-1:-1:-1;;;;;17522:18:0;;;;;;:9;:18;;;;;;;;:51;;;;17589:37;;;;;;;17522:18;;;;17589:37;;;;;;;;;;17256:378;;:::o;17967:418::-;-1:-1:-1;;;;;18051:21:0;;18043:67;;;;-1:-1:-1;;;18043:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18123:49;18144:7;18161:1;18165:6;18123:20;:49::i;:::-;18206:68;18229:6;18206:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18206:18:0;;;;;;:9;:18;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;18185:18:0;;;;;;:9;:18;;;;;:89;18300:12;;:24;;18317:6;18300:16;:24::i;:::-;18285:12;:39;18340:37;;;;;;;;18366:1;;-1:-1:-1;;;;;18340:37:0;;;;;;;;;;;;17967:418;;:::o;32706:127::-;-1:-1:-1;;;;;32763:18:0;;;;;;:8;:18;;;;;;:25;;-1:-1:-1;;32763:25:0;32784:4;32763:25;;;32804:21;;;32763:18;32804:21;32706:127;:::o;22661:2051::-;22739:7;22802:9;:16;22822:2;22802:22;22798:96;;22841:41;;;-1:-1:-1;;;22841:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;22798:96;23255:4;23240:20;;23234:27;23301:4;23286:20;;23280:27;23355:4;23340:20;;23334:27;22963:9;23326:36;24290:66;24276:80;;;24268:127;;;;-1:-1:-1;;;24268:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24414:1;:7;;24419:2;24414:7;:18;;;;24425:1;:7;;24430:2;24425:7;24414:18;24406:65;;;;-1:-1:-1;;;24406:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24569:14;24586:24;24596:4;24602:1;24605;24608;24586:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24586:24:0;;-1:-1:-1;;24586:24:0;;;-1:-1:-1;;;;;;;24629:20:0;;24621:57;;;;;-1:-1:-1;;;24621:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;24698:6;22661:2051;-1:-1:-1;;;;;;22661:2051:0:o;5308:136::-;5366:7;5393:43;5397:1;5400;5393:43;;;;;;;;;;;;;;;;;:3;:43::i","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa2646970667358221220fc6a610537cb2ba86624b82ac9841ac7965591f5e04803d39830cb8c654ef49f64736f6c63430007040033","offset":6029}},"immutableReferences":{},"transformations":[{"id":"1","type":"replace","offset":6029,"reason":"cborAuxdata"}],"transformationValues":{"cborAuxdata":{"1":"0xa264697066735822122028978c229b51c3a9489101e8096301e85866fa63b6ccbd95d247e376d1f5407664736f6c63430007040033"}}},"proxyResolution":{"isProxy":false,"proxyType":null,"implementations":[]},"deployment":{"transactionHash":"0x079625b9f58a40f1948b396b7007d09ff4aa193d7ec798923910fc179294cab8","blockNumber":"11446769","transactionIndex":"17","deployer":"0x06590a641dc3Eb43f2ceBE435576389F209116Da"},"matchId":"1787643","creationMatch":"match","runtimeMatch":"match","verifiedAt":"2024-08-08T13:52:26Z","match":"match","chainId":"1","address":"0xc944E90C64B2c07662A292be6244BDf05Cda44a7"}